2017-05-24 120 views
2

我想用PowerShell做一個簡單的查找和替換。從本質上講,我曾經在一個目錄中有一些支持文件,其名稱與「主」文件相同。除這些支持文件之外的所有文件都不再需要。 「主」文件具有對其他文件路徑的文本引用。我想要做的是在「主」文件中修改此路徑以刪除已刪除的目錄。使用PowerShell替換字符串中包含的字符串

例如,假設我有一個文件C:\Temp\this+that.txt我曾經有C:\Temp\this+that\this+that.dat現在已被轉移到C:\Temp\this+that.dat

C:\Temp\this+that.txt有這樣一行:

/temp/this+that/this+that.dat 

我想這條線成爲:

/temp/this+that.dat 

我有很多這些批處理文件正在移動的文件。使用下面的powershell命令,所有文件名都不包含加號+符號,所有工作都正常。對於這些文件,下面的調用不起作用。

powershell -Command "(gc '!CURRENT_FILE!') -replace '/!BASE_NAME!/', '/' | Set-Content '!CURRENT_FILE!'" 

對於上面的例子中,CURRENT_FILEC:\Temp\this+that.txtBASE_NAMEthis+that

誰能幫我這是爲什麼不工作了包含加+標誌的文件名?

+2

這裏的問題是,您正在將'!BASE_NAME!'當作正則表達式對待。我不知道我的方式PowerShell,但[這個答案看起來可能會幫助](https://stackoverflow.com/questions/23651862/powershell-how-to-escape-all-regex-characters-from-a -string#23651909)。基本上你需要使用特殊的正則表達式來轉義所有字符 - 意思是在將它插入表達式之前。 –

+2

@ma_il完全正確。 「+」字符是RegEx中的一個特殊字符,因此您需要將其轉義。 ''(gc'!CURRENT_FILE!')--replace [regex] :: escape('/!BASE_NAME!/'),'/'| Set-Content'!CURRENT_FILE!'「' – TheMadTechnician

回答

2

@ma_il是完全正確的。 「+」字符是RegEx中的一個特殊字符,因此您需要將其轉義。

powershell -Command "(gc '!CURRENT_FILE!') -replace [regex]::escape('/!BASE_NAME!/'), '/' | Set-Content '!CURRENT_FILE!'" 
+0

謝謝!這工作。 – NickB

相關問題