2012-01-30 59 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

相关问题