在批处理文件中从字符串中移除引号""

16

我使用:

FOR /F "delims=" %%G IN ("%command%") DO SET command=%%~G

要从变量%command%中删除“”引号。如果command = "Shutdown / s / t 00",在此行之后,它将是:Shutdown / s / t 00,它可以正常工作。

但是,当command包含一个字符串,其中有等号(=)时,它也会删除该字符。例如:
以前,command = "D:\ temp \ stinger--ADL--GO--Silent--ReportPath = D:\ temp--ReportOnly--Delete --Program "
之后,command = D:\ temp \ stinger--ADL--GO--Silent--ReportPath D:\ temp--ReportOnly--Delete--Program

看到了吗,引号“”被删除了,但是等号也被删除了。

那么,如何在不删除等于符号的情况下删除引号“”呢?

谢谢


回答位于https://dev59.com/S-o6XIcBkEYKwwoYTzEw#5181182。 - CAD bloke
2个回答

40

你可以使用字符串操作代替对命令进行for循环。

set command=%command:"=%

command之后的值是"=<nul>,因此您可以清除变量命令中的引号。举个例子,您还可以使用%command: = _%将命令中的所有空格替换为下划线。


4
对于字符串操作加一分。建议:在使用字符串操作之前,应检查命令是否已定义,因为如果命令不存在,则操作将失败,而set将使命令字面上等于%command:"=% - David Ruhmann
@Phiber 如果你感兴趣的话,可以查看关于字符串操作的dostips 页面。 - unclemeat
3
"set command=%command:"=%"" <--- 这是为了防止 & 恶意字符的必要设置。 - foxidrive
1
如果您知道该命令已引用,那么这肯定有效。但是,如果有时命令被引用,而有时不被引用,怎么办?您可以添加带有子字符串的IF测试来有条件地删除第一个和最后一个字符。但是还有更好的方法,请参见我的答案 - dbenham
@foxidrive - 移除所有引号可能不可接受。也许命令有应该保留引号的参数。 - dbenham
@dbenham 这是unclemeat的答案,但如果它适用于OP,他们将会看到您的评论。 - foxidrive

10

你的命令失败的原因是字符串中的引号和IN()子句中的引号相互抵消,所以剩余的内容没有被引用。FOR /F解析器将未加引号的=视为标记分隔符,并将其转换为空格。还会出现像&|等有害字符的问题。

使用延迟扩展可以避免此问题。在FOR循环之前切换到延迟状态,在循环内部关闭它,以便保留命令中的任何!

setlocal enableDelayedExpansion
for /f "delims=" %%A in ("!command!") do endlocal & set "command=%%~A"

这种方法的主要优点是,无论命令是否以引号开头,您都可以获得正确的结果。


1
我在想这为什么不能正常工作。需要使用 "setlocal enabledelayedexpansion"。 - leeman24

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接