2017-04-21 16 views
0

私は奇妙なエラーが発生しています。私が以下を実行すると、以下のエラーが表示されます。 $ inputfolderのファイル名は正しいですが、ファイルパスは現在のドライブに変更されていますが、$ inputfolderとして定義したものではありません。それが「ファイルを見つけることができない」という理由です。Powershellエラー、パス/ドライブの指定問題

ファイル 'C:\ path \ of \ current \ drive \ batch.csv'が見つかりませんでした。

私の.ps1を$ inputfolderに移動すると動作します。私は何が悪いのか分からない。変数が定義されています。 も、$ outputpathは機能しません。 done.csvファイルが入力フォルダーに作成されます。

$inputfolder = 'C:/path/to/folder/' 
$inputobject = Get-ChildItem $inputfolder 
$outputpath = Join-Path $inputfolder 'done.csv' 
Import-Csv $inputobject | select COLUMN1,COLUMN1 | Export-Csv -Path $outputpath -NoTypeInformation 

EDIT:完全なエラー報告。再び、 "\ current \ driveのパス"は、.ps1が入っているフォルダがある場所です。変数を定義しても、.ps1を$ inputfolderに移動すると正しく動作します。

Import-Csv : Could not find file 'C:\path\of\current\drive\batch.csv'. 
At C:\path\of\current\drive\myscript.ps1:9 char:1 
+ Import-Csv $inputobject | select COLUMN1,COLUMN2 | Export-Cs ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : OpenError: (:) [Import-Csv], FileNotFoundException 
    + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ImportCsvCommand 
+0

スラッシュは '/'で、ウィンドウ内のパスには円記号\ – user4317867

+0

を使用します。Windowsでパス名を使用するほとんどのコンテキストでは、パス区切り文字として '/'または '\'を使います。 'cmd.exe'は、スイッチインジケータとして' -'の代わりに '/'を使うためではありません。 –

+0

出力先のcsvが入力フォルダに置かれている限り、それはあなたがしたことを正確に行っています。 –

答えて

2

Get-ChildItem(あなたはファイルシステムを見ていることから、この場合には)名前ファイルではない、オブジェクトファイルのセットを返します。ファイルオブジェクトの配列をImport-CSV(またはGet-Content)に渡すと、Nameプロパティが使用されます。ではなく、にパスが含まれます。パスがない場合は、現在のディレクトリを参照することを前提としています。これの解決策は、$inputobjectではなく、ファイルオブジェクトのパスを含む$inputobject.fullnameを渡すことです。

これは、CMD.EXEbashなどのさまざまなUNIX/Linuxシェルなど、テキストベースのインターフェイスに精通している人々の間でよくある誤解です。古いシェルはパイプラインを通してテキストを渡します。 PowerShellは実際のオブジェクトを渡すため、受信データの実際の構造を知る必要があります。

Get-Help about_pipelinesからのPowerShellパイプラインに関する良い情報があります。特定のPowerShellオブジェクトの構造については、Get-Memberにパイプして調べることもできます。

+0

ありがとうございます。非常に明確で直接的。 – physlexic

0

これらのコマンド:ディレクトリ内

$inputfolder = 'C:/path/to/folder/' 
$inputobject = Get-ChildItem $inputfolder 

戻り、すべてのファイル 'C:/パス/ /フォルダに/' はあなたがすべてのファイルを処理してもよろしいでしょうか?たぶん.csvファイルではないでしょうか?

私が使用することをむしろ示唆している:

$inputfolder = 'C:/path/to/folder/' 
$inputobject = Get-Item "$($inputfolder)*.csv" 

これらは、CSVファイルを収集します。

そしてジェフが書いたように、あなたはあなたの最後のコマンドは次のようになりますので、入力と出力オブジェクトのフルネームプロパティを使用する必要があります:

$inputobject | foreach-object { 
Import-Csv $_.fullname | select COLUMN1,COLUMN1 | Export-Csv -Path $outputpath.fullname -NoTypeInformation} 

そして、あなたの$ onputobjectがあることを覚えておいてください1つのファイルではなく、ファイルの集合です。Export-CSVは既存のファイルに「追加」することができないので、-Forceを指定するか、最後に処理されたファイルの結果が得られるか、$ inputobjectコレクションに含まれていることを確認する必要がありますまったく1つのファイル、またはそれ以外の場合、Export-CSVの2回目の実行が中止され、既存のファイルを上書きすることを確認するプロンプトが表示されます。

+0

['Export-Csv'](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/export-csv)は、既存のファイルに'-Append'スイッチ。このコメントのコマンド名のリンクを参照してください。 –

+0

さらに、 '$ outputpath'はファイルオブジェクトではありませんが、文字列です。したがって、必要に応じて出力を配置するためにメンバー参照は必要ありません。 –

関連する問題