我希望它通过递归浏览一些文件夹,查找具有特定结尾的所有文件,然后浏览找到的文件来执行替换然后保存。当我有一个给定的文件名时,我可以使它工作,但是当涉及到未知时,我似乎遇到了一些麻烦。
我们的想法是从文件中读取给定环境的变量并将其作为变量保存到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
答案 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-Object
。 Set-Content
本来会尝试使用当前行作为其名称来触发每一行。此外,为了您和其他人的理智,您应该尝试与是否一致使用别名。我看到ForEach-Object
和%
都可能让新用户感到困惑。