2012-01-30 62 views
0

如何通過替換文件中存在的字符串來將文件名(基本名稱而不是全名)寫入同一文件。 基本上,我在一個名爲C:\ Downloads \ PreValidation的文件夾中有一堆.psf文件。用文件名替換字符串的Powershell腳本

  1. 我想每個文件更改爲.csv格式和
  2. ,而這樣做,所以我想,以取代被稱爲「太空計劃項目」目前 裏面的文件名的文件的記錄,一個沒有串 擴展名。

這是我試圖運行腳本 -

foreach($file in (dir C:\Downloads\PreValidation\*.psf)){ 
$fromdir = "C:\Downloads\Prevalidation\*.psf" 
$fullname = gi $fromdir| select fullname 
$b = $fullname[0] 
$b.fullname 
Copy-Item $file.fullname C:\Downloads\Validation\WIP\psaload1.csv 
Get-Content C:\Downloads\Validation\WIP\psaload.csv | ForEach-Object {$_.replace("Space Planning Project","$b.fullname")} | Set-Content C:\Downloads\Validation\WIP\psaload.csv 
} 

但它的示數出來說

Get-Content : Cannot find path 'C:\Downloads\Validation\WIP\psaload.csv' because it does not exist. 
At C:\cap_sps\powershell\testfilename.ps1:7 char:12 
+ Get-Content <<<< C:\Downloads\Validation\WIP\psaload.csv | ForEach-Object {$_.replace("Space Planning Project","$b.fullname")} | Set-Content C:\Downloads\Validation\WIP\psaload.csv 
+ CategoryInfo   : ObjectNotFound: (C:\Downloads\Validation\WIP\psaload.csv:String) [Get-Content], ItemNotF 
oundException 
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand 

請注意,我用我的最終psaload.csv加載到一個Oracle數據庫,並在我的腳本的最後一步,我將刪除此文件,以便我可以在循環中運行相同的命令,以查看上面文件夾中存在的其他.psf文件。

任何幫助深表謝意。

謝謝, 桑德斯。

回答

4

代碼中有很多冗餘,其中dir在循環中,然後使用該文件再次獲取該項目。此外,您正在爲每個psf文件複製到相同的csv文件,並且複製行提到了一個文件psaload1.csv,但您試圖獲取psaload.csv的內容,導致您看到的錯誤。

嘗試這樣的事情(我想提出一些假設在這裏和未經測試):

gci C:\Downloads\PreValidation\*.psf | %{ 
$file = $_ 
gc $file.fullname | % {$_ -replace "Space Planning Project",$file.BaseName } | Set-Content "C:\Downloads\Validation\WIP\$($file.BaseName).csv" 
} 
+0

感謝Manoj--這是一種魅力。由於我的sqlloader希望加載名爲psaload.csv的文件,因此我只是將Set-Content中的文件名更改爲psaload.csv。這裏是我的基於你的代碼 - gci C:\ Downloads \ PreValidation \ *。psf | %{ $ file = $ _ gc $ file.fullname | %{$ _ -replace「Space Planning Project」,$ file.BaseName} | Set-Content「C:\ Downloads \ Validation \ WIP \ psaload.csv」 cmd.exe/k C:\ CAP_SPS \ Batchscripts \ runfixloader.bat 刪除項目C:\ Downloads \ Validation \ WIP \ psaload.csv } – user982201 2012-01-30 20:15:43

0

要獲取文件對象的BaseName,請使用BaseName屬性。您可以修改腳本,像這樣:

$files = gi $fromdir| select fullname,basename 
$fullname = $files[0].fullname 
$b = $files[0].basename 

至於錯誤信息,您嘗試檢索不存在的文件的內容。您的副本行

Copy-Item $file.fullname C:\Downloads\Validation\WIP\psaload1.csv 

在文件名中有一個「1」,但在下一行中,您的文件名不是Get-Content。

+0

感謝您的答覆zdan。但我現在正在收到以下錯誤 - Copy-Item:無法將參數綁定到參數'Path',因爲它是空的。 在C:\ cap_sps \ powershell \ testfilename.ps1:7 char:10 + Copy-Item <<<< $ files。$ fullname C:\ Downloads \ Validation \ WIP \ psaload1.csv + CategoryInfo:InvalidData :(:) [Copy-Item],ParameterBindingValidationException + FullyQualifiedErrorId:ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.CopyItemCommand Get-Content:找不到路徑'C:\ Downloads \ Validation \ WIP \ psaload1.csv',因爲它不存在。 – user982201 2012-01-30 20:04:42

+0

Contd。來自以前的評論 - + Get-Content <<< C:\ Downloads \ Validation \ WIP \ psaload1.csv | ForEach-Object {$ _。replace(「Space Planning Project」,「$ b」 )} | Set-Content C:\ Downloads \ Validation \ WIP \ psaload。csv + CategoryInfo:ObjectNotFound:(C:\ Downloads \ Validation \ WIP \ psaload1.csv:String)[Get-Content],ItemNot FoundException + FullyQualifiedErrorId:PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand。在下面的註釋中添加我的代碼 - – user982201 2012-01-30 20:04:53

+0

foreach($(dir C:\ Downloads \ PreValidation \ *。psf)中的文件){ $ fromdir =「C:\ Downloads \ Prevalidation \ *。psf」 $ files = gi $ fromdir |選擇全名,基名 $ fullname = $ files [0] .fullname $ b = $ files [0] .basename Copy-Item $ files。$ fullname C:\ Downloads \ Validation \ WIP \ psaload1.csv Get-內容C:\ Downloads \ Validation \ WIP \ psaload1.csv | ForEach-Object {$ _。replace(「Space Planning Project」,「$ b」)} | Set-Content C:\ Downloads \ Validation \ WIP \ psaload.csv cmd.exe/k C:\ CAP_SPS \ Batchscripts \ runfixloader.bat 刪除項目C:\ Downloads \ Validation \ WIP \ psaload.csv Remove-項目C:\ Downloads \ Validation \ WIP \ psaload1.csv – user982201 2012-01-30 20:06:03

相關問題