【问题标题】:Powershell script to replace strings with filenamePowershell脚本用文件名替换字符串
【发布时间】:2012-01-30 19:25:02
【问题描述】:

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

  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 文件循环运行相同的命令存在于上述文件夹中。

非常感谢任何帮助。

谢谢, 桑德斯。

【问题讨论】:

    标签: powershell filenames file-rename


    【解决方案1】:

    您的代码中有很多冗余,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"
    }
    

    【讨论】:

    • 谢谢 Manoj - 这就像一个魅力。由于我的 sqlloader 期望加载名为 psaload.csv 的文件,因此我只是将 Set-Content 中的文件名更改为 psaload.csv。这是我基于你的代码 - gci C:\Downloads\PreValidation*.psf | %{ $file = $_ gc $file.fullname | % {$_ -replace "空间规划项目",$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 }跨度>
    【解决方案2】:

    要获取文件对象的 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 文件名没有。

    【讨论】:

    • 感谢您的回复 zdan。但我现在收到以下错误 - Copy-Item:无法将参数绑定到参数“路径”,因为它为空。在 C:\cap_sps\powershell\testfilename.ps1:7 char:10 + Copy-Item
    • 续。来自之前的评论 - + Get-Content
    • foreach($file in (dir C:\Downloads\PreValidation\*.psf)){ $fromdir = "C:\Downloads\Prevalidation\*.psf" $files = gi $fromdir| select fullname,basename $fullname = $files[0].fullname $b = $files[0].basename Copy-Item $files.$fullname C:\Downloads\Validation\WIP\psaload1.csv Get-Content C:\下载\验证\WIP\psaload1.csv | ForEach-Object {$_.replace("空间规划项目","$b")} |设置内容 C:\Downloads\Validation\WIP\psaload.csv cmd.exe /k C:\CAP_SPS\Batchscripts\runfixloader.bat 删除项目 C:\Downloads\Validation\WIP\psaload.csv 删除项目 C: \Downloads\Validation\WIP\psaload1.csv
    • @user982201:试试 manojlds 的答案,它应该可以满足您的需求。
    猜你喜欢
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2022-10-19
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    相关资源
    最近更新 更多