0

我正在尝试设置一个脚本,旨在更改大约 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在2个不同的地方列出文件并在两个地方替换相同的变量而不必两次使用代码吗?我考虑将我必须使用两次的代码放入一个变量中,在需要时调用它而不是再次编写它,但它似乎在使用它之前解决了代码,并且这并没有完全给我结果,因为数据来自第一部分。

4

1 回答 1

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'.

于 2013-07-29T10:52:31.663 回答