2011-06-22 7 views
3

私はpowershellを初めて使いました。この質問はその点を証明します。私は、このファイルを解析するコマンドを実行しようとしているforeachを使った簡単なpowershellコマンドのコピーで助けが必要

fnameA.ext;fnameB.ext;fnameC.ext;.... 

...私は次のようにセミコロンで区切られたファイル名を含むtxtファイルを持って、コマンドラインから単純な作業をしようとしている、内容を分割セミコロンで入力し、各ファイルのコピーコマンドを目的のディレクトリに実行します。ここで

は、私が実行しているコマンドです:

gc myfile.txt |% {$_.split(";") | copy $_ "C:\my\desired\directory"}

しかし、私は、リスト内の各項目について、このようなエラーを取得しています...

Copy-Item : The input object cannot be bound to any parameters for the command either because the command does not take 
pipeline input or the input and its properties do not match any of the parameters that take pipeline input. 
At line:1 char:36 
+ gc bla.txt |% {$_.split(";") | copy <<<< $_ "C:\my\desired\directory"} 
    + CategoryInfo   : InvalidArgument: (fileA.txt:String) [Copy-Item], ParameterBindingException 
    + FullyQualifiedErrorId : InputObjectNotBound,Microsoft.PowerShell.Commands.CopyItemCommand 

答えて

8

は衝動に抵抗します1ライナーを作る、特にあなたが出発するとき。つまり、分割されたコンテンツを別のForEach-Objectにパイプする必要があるという問題です。

これを試してください:あなたが発見する必要が始まる場合

$File = Get-Content .\MyFile.txt 
$File | ForEach-Object { 
    $_.Split(';') | ForEach-Object { 
     Copy-Item -Path "$_" -Destination 'C:\destination' 
    } 
} 
+0

ワンライナーの回避に完全に同意します。 _常に、簡潔性よりも読みやすさが優先されます。 –

1

@Baconのアドバイスは非常に良好であることPowerShellコマンドレットの出力オブジェクトまたはオブジェクトのリストと、あなたはこれらのプロパティとメソッドを使用することができますオブジェクト。ここで

は(楽しみのために)短い方法です:

(${c:\temp\myfile.txt }).split(';') | % {cp $_ C:\my\desired\directory} 
+0

これを試しましたが、これはもともと私が望んでいた解決策の一種です。私はそれを動作させるために少し混乱させなければならなかった。ここで私が '(gc myfile.txt).split( ';')を使って終わったのです。 | %{cp $ _ "C:\ my \ desired \ directory"} ' – Dave

+0

私は取得しました。ヌル値の式でメソッドを呼び出すことはできません。 行:1 char:20 +($ {myfile.txt})。split <<<<( ';')| %{cp $ _ C:¥my¥desired¥directory'} – Dave

+0

私は編集しました:実際には、$ {}フォームを使用しているときにファイルのフルパスをコーディングする必要があります。 – JPBlanc

2

ちょうどノート:あなたは(@Bacon) - eachsのために巣を必要とするか、または括弧を使用しないでください(@JPBlanc)、ちょうど使用

Get-Content d:\test\file.txt | 
    Foreach-Object {$_ -split ';'} | 
    Copy-Item -dest d:\test\xx 

はまた、あなたがあなたをかむかもしれないファイルへの相対パスを使用することに注意してください。

0
(Get-Content myfile.txt) -Split ';' | Copy-Item -Destination C:\my\desired\directory 
関連する問題