2017-01-11 3 views
0

Я работаю над этим уже пару часов и не могу понять, что мне может не хватать. В основном, я получаю список всех файлов XML в папке и подпапках. Перемещаясь через эти файлы, я заменяю строку другим и записываю ее обратно в тот же файл. Ниже приведена строка, в которой я работаю:Строка не может быть выполнена должным образом

$destination = "C:\Temp\TestFolder" 
$newString = "#NewString#" 

Get-ChildItem '$($destination)*.xml' -Recurse | ForEach { 
    $currFile = $_.FullName; 
    (Get-Content $_ | ForEach { 
     $_ -Replace '#OldString#', '$($newString)' 
    }) | Set-Content -Path $currFile; 
} 
+1

Привет, в чем проблема? Вы получаете сообщение об ошибке? – sodawillow

+0

Нет ошибок, но я не вижу, чтобы изменения действительно происходили в любом из файлов. –

+2

'' $ ($ destination) \ *. Xml'' (обратите внимание на обратную косую черту) –

ответ

3

Проблема в том, что вы фактически не указываете на правильный каталог.

При выполнении этой команды:

Get-ChildItem '$($destination)*.xml' -Recurse 

Вы используете одиночные кавычки. Одиночные кавычки не допускают расширения строки, например, вы пытаетесь сделать с $($destination). Когда PowerShell запускает это, он ищет файлы в пути с именем $ ($ destination), который не будет существовать.

Вместо этого замените их двойными кавычками или, что еще лучше, удалите цитаты целиком.

Get-ChildItem $destination\*.xml -Recurse 

Наконец, вам не нужно использовать For-Each цикл, чтобы заменить все экземпляры этой строки. Можно вызвать Get-Content, затем вызвать replace и, наконец, установить значение все на одной строке, например:

$files = Get-ChildItem $destination\*.xml -Recurse 
ForEach ($file in $files){ 
    Set-Content ((Get-Content $File.FullName) -Replace '#OldString#', $newString) ` 
    -Path $file.fullname 
} 
Смежные вопросы