我想用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_FILE
是C:\Temp\this+that.txt
和BASE_NAME
将this+that
谁能帮我这是为什么不工作了包含加+
标志的文件名?
这里的问题是,您正在将'!BASE_NAME!'当作正则表达式对待。我不知道我的方式PowerShell,但[这个答案看起来可能会帮助](https://stackoverflow.com/questions/23651862/powershell-how-to-escape-all-regex-characters-from-a -string#23651909)。基本上你需要使用特殊的正则表达式来转义所有字符 - 意思是在将它插入表达式之前。 –
@ma_il完全正确。 “+”字符是RegEx中的一个特殊字符,因此您需要将其转义。 ''(gc'!CURRENT_FILE!')--replace [regex] :: escape('/!BASE_NAME!/'),'/'| Set-Content'!CURRENT_FILE!'“' – TheMadTechnician