我正在尝试设置一个脚本,用于在大约50个文件中更改100多个占位符。总的来说,我得到了一个可能的占位符列表及其值。我得到了一些具有exe.config文件和ini文件的应用程序。这些应用程序存储在c:\ programfiles(x86)\和d:\中。一般来说,我设法使它适用于一个路径,但不能使用两个路径。我可以很容易地编写代码来替换两次,但是这给我留下了很多杂乱的代码,并且其他人也难以阅读。
ls c:\programfiles(x86) -Recurse | where-object {$_.Extension -eq ".config" -or $_.Extension -eq ".ini"} | %{(gc $PSPath) | %{
$_ -replace "abc", "qwe" `
-replace "lkj", "hgs" `
-replace "hfd", "fgd"
} | sc $_PSPath; Write-Host "Processed: " + $_.Fullname}
我试图通过放置$ a = path1,$ b = path2,c $ = $ a + $ b来包含2个路径,这似乎可以使ls命令在两个不同的地方运行。但是,它似乎不存储文件所在的路径,因此它将尝试替换它在您当前运行脚本的文件夹中找到的文件名。因此,即使我可能在文件所在的地方之一,它也不在另一个......
所以..任何想法我怎么能让Powershell在两个不同的地方列出文件并在两个地方替换相同的变量而不必让代码两次?我想把把我必须使用两次的代码放到一个变量中,在我需要的时候调用它而不是再次写它,但它似乎在使用之前解析了代码,并且这并没有给我结果,因为数据来自第一部分。
答案 0 :(得分:1)
如果你有一个很酷的管道,那么每个问题看起来都像......呃......流体?对象?我没有线索。但无论如何,只需添加另一层(并解决一些问题):
$places = 'C:\Program Files (x86)', 'D:\some other location'
$places |
Get-ChildItem -Recurse -Include *.ini,*.config |
ForEach-Object {
(Get-Content $_) -replace 'abc', 'qwe' `
-replace 'lkj', 'hgs' `
-replace 'hfd', 'fgd' |
Set-Content $_
'Processed: {0}' -f $_.FullName
}
值得注意的变化:
Get-ChildItem
中进行过滤可加快速度并保存Where-Object
。-replace
可以直接应用于数组,不需要其他ForEach-Object
。如果替换次数很多,您可以考虑使用散列表来存储它们,这样就不会有20行-replace 'foo', 'bar'
。