2013-05-28 175 views
3

我想写的代替代替使用PowerShell

find -name "*.xml" | xargs grep -l "Search String" 
     | xargs perl -p -i -e 's/Search String/Replace String/g' 

在PowerShell中的等价物。这是我想出的。的

Get-ChildItem 'D:\code\cpp\FileHandlingCpp\input - Copy' -Recurse | 
Select-String -SimpleMatch $src_str | 
foreach{(Get-Content $_.path) | ForEach-Object { $_ -replace $src_str, $target_str }} 

我得到的错误“,因为它正在使用由另一个进程的进程无法访问该文件。”于是,我与多行版本出来了,如下图所示。我能够做替换现在字符串除了一个在$ src_str。这有什么错$ src_str?

$src_str="<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?>" 
$target_str="" 
echo $src_str 

foreach ($var in (Get-ChildItem 'D:\code\cpp\FileHandlingCpp\input - Copy' -Recurse 
        | Select-String -SimpleMatch $src_str).Path) 
{  
    (Get-Content $var) | ForEach-Object { $_ -replace $src_str, $target_str } 
    | Set-Content $var  
} 

回答

5

也许这将有助于我们回到你原来实施的Unix版本等效的目标。这在本质上是等同的PowerShell版本。

$search = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>' 
$replace = 'test' 
$dir = 'D:\code\cpp\FileHandlingCpp\input - Copy' 

dir -Path $dir -Recurse -Filter *.xml | ForEach-Object { 
    (Get-Content -Path $_.FullName) -replace $search, $replace | 
     Set-Content $_.FullName 
} 

注意 - 注意文本文件编码更改,可能会因重新写入文件而发生变化。如果您需要使用Set-Content-Encoding参数,则可以指定输出编码。 ASCII

+0

我会测试并取回给您。 – Jagannath

2

这花了我一段时间才弄清楚,但我明白了!

这是一个班轮。只需转到要开始的文件夹并键入此内容。更改file.name(如果需要,请使用通配符),string1和string2中包含要搜索的文件名以及要替换为string2的string1 。

所以这个搜索文件夹是递归的,对于每个文件它用另一个字符串替换一个字符串并保存它。基本上是Get-Childitem | ForEach-Object替换并保存。

全套!

get-childitem -include file.name -Recurse | ForEach-Object { (Get-Content -Path $_.FullName) -replace 'string1', 'string2' | set-content $_.fullname }