![](/img/trans.png)
[英]Extend PowerShell to search/replace and perform on all files in directory?
[英]Use powershell to replace value in all files in directory
這可能很簡單,但是我正在嘗試編寫一個腳本,以便將已安裝程序的目錄從一台計算機移動到另一台計算機時使用。 為了使此工作正常進行,我必須從舊計算機上找到舊主機名,舊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之后的逗號,這似乎使我通過了子文件夾。 但是它仍然沒有用E:\\ Folder替換任何C:\\ Folder實例
這很好。 將逗號放在* .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 $_
}
我建議:
## 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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.