执行变量替换并保存文件

时间:2014-12-22 09:23:35

标签: powershell

我希望它通过递归浏览一些文件夹,查找具有特定结尾的所有文件,然后浏览找到的文件来执行替换然后保存。当我有一个给定的文件名时,我可以使它工作,但是当涉及到未知时,我似乎遇到了一些麻烦。

我们的想法是从文件中读取给定环境的变量并将其作为变量保存到PowerShell中(这部分似乎有效,所以我没有再提及它),然后简单地用一组中的提到的变量替换它们未知档案。

我一直在关注this question,这似乎有类似的问题,除了我正在尝试使用变量替代。还看了一些previous answer for replace,但同样,这不是替换,而是变量替换,所以它看起来有点不同。所以考虑到这一点,这是我到目前为止所得到的:

查看第一个链接中的示例后:

Get-ChildItem -Path .\ -Include *.ini,*.exe.config -Recurse | %{ gc $_ } | %{
  $ExecutionContext.InvokeCommand.ExpandString($_) +
    (Get-Content $_.FullName | Out-String ) | Set-Content -Path $_.FullName
}

尝试使用第二个链接执行某些操作后:

    $places = 'C:\Users\Roger\Documents\test\Program Files (x86)'
    $places |
      Get-ChildItem -Recurse -Include *.ini,*.config |
      ForEach-Object {
        (Get-Content $_) | % {
          $ExecutionContext.InvokeCommand.ExpandString($_) |
            Set-Content $_
          'Processed: {0}' -f $_.FullName
        }
}

当然我自己的微弱尝试:

Get-ChildItem .\ -Include *.ini,*.exe.config -Recurse | %{ gc $_ } | %{
  $ExecutionContext.InvokeCommand.ExpandString($_)
} | Set-Content $_.FullName

1 个答案:

答案 0 :(得分:1)

$places = 'C:\temp'
$places |
Get-ChildItem -Recurse -Include *.ini,*.config | ForEach-Object {
    (Get-Content $_) | ForEach-Object {
        $ExecutionContext.InvokeCommand.ExpandString($_)
    } | Set-Content $_
    'Processed: {0}' -f $_.FullName
}

Set-Content移出内部ForEach-ObjectSet-Content本来会尝试使用当前行作为其名称来触发每一行。此外,为了您和其他人的理智,您应该尝试与是否一致使用别名。我看到ForEach-Object%都可能让新用户感到困惑。