使用带有“%%G”和“%%~nG”的 powershell 时出错

使用带有“%%G”和“%%~nG”的 powershell 时出错

我正在尝试在批处理文件中运行以下 powershell 命令来替换所有 txt 文件中的文本字符串,但我一直看到错误“找不到接受参数的位置参数”,其中有错误末尾提到的文件名中的单词,如“-”等等。

FOR /F "tokens=*" %%G IN ('dir /b *.txt') DO powershell -Command "(gc %%G) -replace 'this', 'that' | Out-File -encoding ASCII %%~nG.txt"

如果我不在%%~nG.txtpowershell 命令末尾使用,而是明确引用文本文件(文件名中没有空格),那么它确实有效。

我确信这是因为%%~nG.txt末尾没有引号(而需要是因为文件名有空格?)但我不知道需要进行什么调整才能解决这个问题。

我尝试将最终文件名放在引号中:"%%~nG.txt"但是这不起作用,我尝试用反引号转义倒数第二个双引号字符,这样 powershell 就不会认为命令在那里结束但这也不起作用。

由于其他原因,我无法将命令括在单引号中(我要替换的长文本字符串本身包含单引号和双引号之类的内容,但一切都正常)。

我是否将批处理文件变量与 powershell 命令混合使用,但这样做不起作用?

我也尝试过“jrepl.bat”(来自这里:https://www.dostips.com/forum/viewtopic.php?f=3&t=6044),下面的例子中,这应该将所有双引号替换为空,但它也不起作用:

FOR /F "tokens=*" %%G IN ('dir /b *.txt') DO call "%~dp0jrepl.bat" "\q" "" \xseq \f "%%G" /O -

这可以替换几乎任何字符串,除非它有一个双引号,否则它不会这样做,即使\xeq它有一个选项,并且我已将双引号设置为\q它所说的那样。

干杯。

答案1

Dave 加油。在看到你的评论之前,我终于让它工作了。

经过6个小时的反复试验!

如果其他人也尝试这样做,那么这里有解决方案。

这将使用 bat 文件内部的 powershell,并替换 bat 文件旁边每个 .txt 文件中的文本字符串:

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'old text', 'new text' | Set-Content $_.FullName}"

据说在 powershell 中使用反引号来转义字符,但在批处理文件中,情况就变得复杂了。我发现只需添加另一个百分号即可转义百分号,而反引号(powershell 转义字符)在批处理文件中对我来说从来都不起作用。双引号通过使用三个双引号来转义(有时需要四个,不知道为什么)。冒号和正斜杠等字符不需要转义。其他字符...我不需要替换,所以我不知道。

相关内容