2017-05-24 121 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

相关问题