簡體   English   中英

使用Powershell替換目錄中所有文件中的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM