2017-04-21 20 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 

編輯:完整的錯誤報告;再次,「路徑\的\當前\驅動器」是我有文件夾中的.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.EXE或各種UNIX/Linux shell如bash。那些較舊的shell通過管道傳遞文本; PowerShell傳遞實際對象,並且您需要知道傳入數據的實際結構。

關於來自Get-Help about_pipelines的PowerShell管道有很好的信息。您還可以通過將其管道到Get-Member來了解特定PowerShell對象的結構。

+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是不是一個文件,而是一組文件!Export-CSV不能「附加」到現有的文件,所以要麼必須指定-Force,這樣你將得到最後一個處理文件的結果,或者你必須確保$ inputobject集合包含只是一個文件,否則第二次執行Export-CSV將停止並提示確認是否覆蓋現有文件。

+0

['Export-Csv'](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/export-csv)絕對可以附加到現有文件,使用''添加'開關;請參閱此評論中命令名稱的鏈接。 –

+0

另外''outputpath'不是一個文件對象,而是一個字符串;因此,它不需要任何成員引用來將輸出放置在期望的位置。 –