Используйте powershell для замены значения во всех файлах в каталоге - PullRequest
0 голосов
/ 09 мая 2019

Это, вероятно, легко, но я пытаюсь написать скрипт для использования при перемещении каталога для установленной программы с одного компьютера на другой.Чтобы сделать это, мне нужно найти каждый экземпляр старого имени хоста, старого IP-адреса и старой буквы диска со старой машины и заменить их новым именем хоста, новым IP-адресом и новой буквой диска нановая машина.Основная папка содержит файлы * .xml и * .config, которые необходимо редактировать как в основной папке, так и в подпапках.

Это код, с которым я работаю:

$oldIP = "192.168.1.2"
$newIP = "192.168.1.3"
$oldhost = "OLDHOSTNAME"
$newhost = "NEWHOSTNAME"
$oldDriveLetter = "C"
$newDriveletter = "E"

$path = "\\$newip\$newdriveletter$\Folder"
$files = get-childitem $path\* -include *.xml, *.config, -recurse 
$files | %{
    (gc $_) -replace $oldhost, $newhost -replace $oldip, $newip -replace "${olddriveletter}:\Folder", "${newDriveLetter}:\Folder" | set-content $_.fullname
}

В настоящее время он заменяет только значения в основной папке, но не какие-либо из подпапок.Любая идея, что мне не хватает?

Редактировать: В соответствии с предложением ниже, я удалил запятую после * .config, и это, кажется, проходит через подпапки.Но он по-прежнему не заменяет ни один экземпляр C: \ Folder на E: \ Folder

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Это отлично работает.Снял запятую с конца * .config и добавил еще один \ в середине $ {olddriveletter}: \ Folder.

$oldIP = "192.168.1.2"
$newIP = "192.168.1.3"
$oldhost = "OLDHOSTNAME"
$newhost = "NEWHOSTNAME"
$oldDriveLetter = "C"
$newDriveletter = "E"

$path = "."
$files = get-childitem $path\* -include *.xml, *.config -recurse 
$files | %{
    (gc $_) -replace $oldhost, $newhost -replace $oldip, 
       $newip -replace "${olddriveletter}:\\Folder","${newDriveLetter}:\Folder" | 
       set-content $_.fullname
}

Пытался немного его упростить.Жаль, что вы не можете просто сделать «get-childitem | get-content -replace | set-content».

get-childitem $path\* -include *.xml, *.config -recurse | 
foreach {
  (get-content $_) -replace $oldhost,$newhost -replace $oldip,
  $newip -replace "${olddriveletter}:\\Folder", "${newDriveLetter}:\Folder" |
  set-content $_ 
}
0 голосов
/ 09 мая 2019

Предлагаю:


## Q:\Test\2019\05\09\SO_56064191.ps1

$oldIP = "192.168.1.2"
$newIP = "192.168.1.3"
$oldhost = "OLDHOSTNAME"
$newhost = "NEWHOSTNAME"
$oldDriveLetter = "C"
$newDriveletter = "E"

$path = '\\{0}\{1}$\Folder' -f $newip,$newdriveletter

ForEach($File in (Get-ChildItem $path\* -Include *.xml,*.config -Recurse)){
    (Get-Content $File.FullName -raw) -replace [RegEx]::Escape($oldhost),$newhost `
                                 -replace [RegEx]::Escape($oldip),$newip `
                                 -replace "$olddriveletter(?=:\Folder)",$newDriveLetter | 
     Set-Content $File.FullName -NoNewline
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...