【问题标题】:remove quotes "" from string in batch file从批处理文件中的字符串中删除引号“”
【发布时间】:2014-03-13 00:10:12
【问题描述】:

我用:

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

从变量 %command% 中删除 "" 引号。如果 command = "Shutdown /s /t 00",则在此行之后将是:Shutdown /s /t 00。它有效。 但是当命令包含一个等号 (=) 的字符串时,它也会删除这个字符。示例:
之前,命令 = "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

看,引号“”被删除了,还有符号=。

那么,如何在不删除等号的情况下删除引号“”。

谢谢

【问题讨论】:

标签: windows batch-file


【解决方案1】:

您可以只使用字符串操作,而不是通过命令进行 for 循环。

set command=%command:"=%

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

【讨论】:

  • +1 用于字符串操作。 建议: if defined command set "command=%command:"=%" 在使用字符串操作之前,您要检查命令是否已定义,因为如果命令不存在,则操作将失败,set 将使命令字面上等于 %command:"=%
  • @Phiber 如果您有兴趣,请查看dostips 字符串操作页面。
  • "set command=%command:"=%" &毒字符所必需的
  • 当然,如果您知道该命令被引用,这将起作用。但是,如果有时命令被引用,有时不被引用怎么办?您可以添加带有子字符串的 IF 测试,以有条件地删除第一个和最后一个字符。但是有一个更好的方法。见my answer
  • @foxidrive - 删除所有引号可能是不可接受的。也许该命令的参数应该保持引用。
【解决方案2】:

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

使用延迟扩展可以避免该问题。延迟状态在 FOR 循环之前打开,并在循环内关闭,以便保留命令中的任何 !

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

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

【讨论】:

  • 我想知道为什么这不起作用。需要“setlocal enabledelayedexpansion”
猜你喜欢
  • 2011-03-14
  • 2022-01-22
  • 2010-10-22
  • 2011-08-11
  • 2015-12-27
  • 1970-01-01
  • 2011-04-20
  • 2017-07-02
  • 2017-11-10
相关资源
最近更新 更多