用文件名替换字符串的Powershell脚本

时间:2012-01-30 19:25:03

标签: powershell filenames file-rename

如何通过替换文件中的字符串将文件名(basename而不是fullname)写入同一文件。 基本上,我在一个名为C:\ Downloads \ PreValidation的文件夹中有一堆.psf文件。

  1. 我想将每个文件更改为.csv格式和
  2. 这样做的时候我想替换名为'Space Planning Project'的字符串 在文件的一个记录里面,文件名没有 扩展。
  3. 这是我试图运行的脚本 -

    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文件运行相同的命令出现在上面的文件夹中。

    非常感谢任何帮助。

    谢谢, 桑德斯。

2 个答案:

答案 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的文件名不是。