如何通过替换文件中的字符串将文件名(basename而不是fullname)写入同一文件。 基本上,我在一个名为C:\ Downloads \ PreValidation的文件夹中有一堆.psf文件。
这是我试图运行的脚本 -
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文件运行相同的命令出现在上面的文件夹中。
非常感谢任何帮助。
谢谢, 桑德斯。
答案 0 :(得分: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"
}
答案 1 :(得分: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的文件名不是。