5

私は同等のものを書こうとしています

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

パワーシェルで。これが私が思いついたものです。

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    
}
4

2 に答える 2

9

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

于 2013-05-29T01:59:46.480 に答える