0

我想让 PowerShell 脚本循环遍历目录中的所有 .xml 文件并删除匹配的 .xml 节点。我还想保存原始 .xml 文件的副本。

我有这行代码,可以一次更改一个文件。但是,我希望有一个脚本对文件夹中的所有 .xml 文件执行此操作。

Get-Content \\network\path\file1.xml | Where-Object {$_ -notmatch '<NUGLET key="000000000000025"/>'} | Set-Content \\network\path\file1.new.xml

我一直在处理这个脚本,但我现在似乎在我的文档目录中而不是在网络路径中查找。

Get-ChildItem \\network\path\ *.xml | 
ForEach-Object {
# Load the file's contents, delete string
(Get-Content $_) | Where-Object {$_ -notmatch '<NUGLET key="000000000000025"/>'} 
}

那么为什么我会收到以下错误?

Get-Content : Cannot find path 'C:\Users\username\Documents\file1.xml' because it does not exist.
At C:\Users\username\Local\Temp\4a8c4fc2-9af6-4c35-ab40-99d88cf67a86.ps1:5 char:14
+     (Get-Content <<<<  $_) | Where-Object {$_ -notmatch '<NUGLET key="000000000000025"/>'} 
+ CategoryInfo          : ObjectNotFound: (C:\Users\userna...-file1.xml:String) [Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

以及如何修改脚本以复制原始 xml 文件以进行备份。

编辑:

因此,根据 Nate 的建议,我现在使用以下内容:

Get-ChildItem \\network\path\ *.xml | 
ForEach-Object {
# Load the file's contents, delete string
(Get-Content $_.fullname) | Where-Object {$_ -notmatch '<NUGLET key="000000000000025"/>' | Set-Content $_.fullname} 
}
4

1 回答 1

2

$_inGet-Content $_只是将文件名传递Get-Content,而不是完整路径,导致Get-Content在当前目录中查找它。

试试Get-Content $_.FullName吧。


完整的脚本,包括复制文件,将类似于:

Get-ChildItem \\network\path\ *.xml |
ForEach-Object {
    Copy-Item $_.FullName ((Join-Path $_.Directory $_.BaseName) + ".orig" + $_.Extension )
    (Get-Content $_.fullname) | Where-Object {$_ -notmatch '<NUGLET key="000000000000025"/>' | Set-Content $_.fullname} 
}
于 2013-04-26T17:48:17.760 回答