2013-05-28 3 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

Мне потребовалось некоторое время, чтобы выяснить, но я понял!

Это один лайнер. Просто перейдите в папку, в которую хотите начать, и введите ее. Измените файл.name (используйте wild cards, если хотите), и string1 и string2 с именем файла, которое вы хотите найти, и строку1, которую вы хотите заменить на строку2 ,

Таким образом, он ищет папки рекурсивно, и для каждого файла он заменяет строку другой строкой и сохраняет ее. В основном Get-Childitem | ForEach-Object Заменить и сохранить.

Все комплекты!

get-childitem -include file.name -Recurse | ForEach-Object { (Get-Content -Path $_.FullName) -replace 'string1', 'string2' | set-content $_.fullname } 
Смежные вопросы