2017-07-12 65 views
0

我的問題是我想更改保存在文件夾及其子文件夾中的INI文件中的路徑。使用PowerShell進行INI編輯

該文件夾的路徑是C:\New\Path\

實例INI文件:

 
notAIniText = C:\A\Path\notAIniText 
maybeAIniText = C:\A\Path\maybeAIniText 
AIniText = C:\A\Path\AIniText 

我讀到PSini一些其他的問題,但我不希望只是ID,因爲我想用腳本多臺PC上,我不希望安裝的每時間PSIni。

我想:

$mabyIni = "C:\New\Path" 
$AiniFile = Get-ChildItem - Path "C:\New\Path\*" -Include *.ini -Recurse 
foreach ($file in $AiniFile) { 
    Select-String -Path $file -AllMatches "C:\A\Path\" | ForEach-Opject { 
     $file -replace [regex]:Escape('C:\A\Path'), ('$mabyIni') 
    } | Set-Content $mabyIni -Include *.ini 

但是,這是行不通的。我也嘗試過Get-Content,但那也行不通。

有沒有什麼方法可以使用PSini?

+0

它應該在ini文件中搜索Path,並用 替換爲新的。我試過也是:$ mabyIni =「C:\ New \ Path」 $ AiniFile = Get-ChildItem - 路徑「C:\ New \ Path \ *」-include * .ini -recurse ForEach($ file in $ AiniFile) { (Get-Content $ AiniFile.PSPath)| ForEach-Opject {$ file -replace [regex]:Escape('C:\ A \ Path'),('$ mabyIni')} | 設置內容$ mabyIni -include * .ini – Mkey

+0

你應該更新你的問題,而不是發表評論。評論中的代碼很難閱讀。無論如何,我在你的評論中看到了代碼的問題,並且我會寫出一個答案,說明爲什麼它不起作用。 – TheMadTechnician

回答

2

評論中的代碼很接近,但只是有一些語法問題。它開始強:

$mabyIni = "C:\New\Path" 
$AiniFile = Get-ChildItem - Path "C:\New\Path*" -include *.ini -recurse 
ForEach($file in $AiniFile) { 

到目前爲止,這麼好。您可以定義新路徑,並在舊路徑中獲取.ini文件列表,然後開始循環這些文件。到目前爲止,這是很好的代碼。然後事情開始迷誤。

我看到你試圖讓每個.ini文件的內容,有關替換字符串,然後將該文件複製到新的路徑與此輸出:

(Get-Content $AiniFile.PSPath) | ForEach-Object { 
     $file -replace [regex]:Escape('C:\A\Path'),('$mabyIni') 
    }| Set-Content $mabyIni -include *.ini 

不幸的是你使用錯誤的變量,並在那裏增加一個額外的ForEach循環。我們從Get-Content一行開始。在此腳本中,您正在循環文件,每個當前文件由$file表示。所以你真正想得到的內容是$file,而不是$AiniFile.PSPath

(Get-Content $file) 

好吧,那讓我們把那個文件的內容當作一個字符串數組。現在,我猜你不知道,但-Replace運算符工作在字符串數組。完美,我們只是碰巧得到了一串字符串!由於Get-Content命令被封裝在括號中,所以它首先完成,我們實際上可以緊跟其後的命令-Replace

(Get-Content $file) -replace [regex]:Escape('C:\A\Path'),$mabyIni 

您的-replace命令,你有超級接近!事實上,我必須給你在那裏使用[regex]::escape()的道具。這完全是一個親舉動,幹得好!唯一的問題是替換字符串不需要在括號中,並且它是單引號的,所以它不會擴展字符串,並且.ini文件將全部具有如下行:

AIniText = $mabyIni\AIniText 

不完全是你想要的我猜,所以我刪除了括號(他們沒有傷害任何東西,但也沒有幫助,所以爲了清潔和簡單,我擺脫了他們),我擺脫了單引號'以及我們真的只想要存儲在該變量中的字符串。

所以現在我們循環瀏覽文件,讀取內容,用新路徑替換舊路徑,剩下的就是輸出新的.ini文件。它看起來已經就位,所以我們只使用文件的現有路徑,並將內容設置爲更新後的數據。

(Get-Content $file) -replace [regex]:Escape('C:\A\Path'),$mabyIni | Set-Content -Path $File.FullName 

好的,完成了!您只需關閉ForEach循環,然後運行它。

$mabyIni = "C:\New\Path" 
$AiniFile = Get-ChildItem - Path "C:\New\Path*" -include *.ini -recurse 
ForEach($file in $AiniFile) { 
    (Get-Content $file) -replace [regex]:Escape('C:\A\Path'),$mabyIni | Set-Content -Path $File.FullName 
}