【问题标题】:How do I include quotes in the command inside the quotes of FOR /F如何在 FOR /F 的引号内的命令中包含引号
【发布时间】:2015-10-02 22:30:15
【问题描述】:

这很好用。

 FOR /f "delims=" %%G in ('TagRead.exe %%L Genre') DO ( echo %GG )

但是当我将 sed 命令添加到 ('...') 时,它会失败

 FOR /f "delims=" %%G in (
 'TagRead.exe %%L Genre ^| sed -E ''/Curtain^|Exit^|Spacer/^^!s~.*~Dance~'' '
 ) DO ( echo %%G)

输出:

 sed: newline or end of file found in pattern

编辑:尽管这个无循环命令成功了:

  TagRead.exe C:\temp\1.wma Genre | sed -E '/Curtain^|Exit^|Spacer/^!s~.*~Dance~'

如何让 sed 命令及其引号被 (...) 引号所接受?

编辑:dbenham 说:“与 FOR /F 一起使用时,单引号永远不需要转义。最外面的单引号分隔命令字符串,任何内部单引号都可以正常工作。”

解决方案如下:

FOR /f "delims=" %%G in (
'TagRead.exe %%L Genre ^| sed -E '/Curtain^|Exit^|Spacer/^^!s~.*~Dance~''
) DO ( echo %%G)

失败了:

The syntax of the command is incorrect.

编辑:这是一个简化的独立版本,希望能解决这个问题:

FOR /f "delims=" %%G in (
'echo xxx ^| sed -E '/yyy/^^!s~.*~zzz~''
) DO ( echo %%G)

成功:

zzz

这个:

echo xxx | sed -E '/yyy^|uuu/^!s~.*~zzz~'

成功:

zzz

这个:

FOR /f "delims=" %%G in (
'echo xxx ^| sed -E ''/yyy^|uuu/^^!s~.*~zzz~'''
) DO ( echo %%G)

失败:

'uuu' is not recognized as an internal or external command, operable program or batch file.

----------- 解决方案-----------

失败的原因不是引号。这是一些没有充分逃脱的^。从 dbenham 的 1) 中,最小的修复是:

FOR /f "delims=" %%G in (
'TagRead.exe %%L Genre ^| sed -E ''/Curtain^^^|Exit^^^|Spacer/^^!s~.*~Dance~'' '
) DO ( echo %%G)

对于简化版:

FOR /f "delims=" %%G in (
'echo xxx ^| sed -E ''/yyy^^^|uuu/^^!s~.*~zzz~'''
) DO ( echo %%G)

也可以去掉一些多余的 ' :

FOR /f "delims=" %%G in (
'TagRead.exe  %%L Genre ^| sed -E '/Curtain^^^|Exit^^^|Spacer/^^!s~.*~Dance~' '
) DO ( echo %%G)

FOR /f "delims=" %%G in (
'echo xxx ^| sed -E '/yyy^^^|uuu/^^!s~.*~zzz~''
) DO ( echo %%G)

编辑:一个更简单的实例中的解决方案:

FOR /f "delims=" %%G in ('echo "xxx^^^|ppp" ^| find "x^^^|p"') DO ( echo %%G)

【问题讨论】:

  • 请显示独立工作的完整命令(不带 FOR /F),然后我可以提供一个或多个选项以将命令包含在 FOR /F IN() 子句中。跨度>
  • @dbenham 谢谢,我已经完成了。另外添加了一个简化示例。
  • 发布的无循环命令不可能工作 - 你错误地逃脱了管道。请在没有循环的情况下从批处理脚本执行命令,当您有工作版本时,从脚本中复制命令并将其粘贴到已编辑的问题中。
  • 你是对的。它被接受了,但没有成功。我已经纠正了。谢谢。
  • 使用您向我们展示的命令应该显示什么输出? for /f "delims=" %g in ('echo xxx ^| sed -E '/yyy^^^|uuu/^^!s~.*~zzz~'') do @( echo %g)

标签: windows batch-file for-loop sed cmd


【解决方案1】:

FOR /F 通过新的 cmd.exe 进程运行命令。

例如:

for /f %%A in ('echo hello') do echo %%A

FOR /F 使用以下命令运行命令:

C:\Windows\system32\cmd.exe /c echo hello

在此发布时,所需的命令仍未在问题中正确发布。让我们假设正确的操作命令如下(对我来说毫无意义)

TagRead.exe C:\temp\1.wma Genre | sed -E '/Curtain^|Exit^|Spacer/^^!s~.*~Dance~'

您想将命令放在 FOR /F 循环中。

你有两个选择。

1) 可以对所有毒字符进行转义,使其正确通过cmd.exe命令:

for /f "delims=" %%G in ('TagRead.exe C:\temp\1.wma Genre ^| sed -E '/Curtain^^^|Exit^^^|Spacer/^^!s~.*~Dance~'') do echo %%G

我猜您最初将! 转义为^^!,因为您启用了延迟扩展。新的 cmd.exe 进程将禁用延迟扩展,因此您不需要对此构造进行额外的转义。

2) 或者您可以使用 CMD.EXE 在使用 /C 命令时去除最外面的双引号这一事实。您需要做的就是添加双引号 :-)

for /f "delims=" %%G in ('"TagRead.exe C:\temp\1.wma Genre | sed -E '/Curtain^|Exit^|Spacer/^!s~.*~Dance~'"') do echo %%G

在这种情况下,^ 必须在 ! 之前删除,因为延迟扩展的工作原理:引用转义 ! = "^!",未引用 = ^^!

当然,以上所有都取决于原始命令(没有循环)是否有效。在我看来这很可疑。无论如何,上述概念适用于大多数放入 FOR /F 循环的工作命令。

【讨论】:

  • EDIT - 在选项 2 中启用延迟扩展时更正了引用 ! 的转义序列)
【解决方案2】:

试试usebackqhttp://ss64.com/nt/for_f.html

for /f "usebackq delims=" %%g in (
  `TagRead.exe %%L Genre ^
  ^| sed -E '/Curtain^|Exit^|Spacer/^^!s~.*~Dance~' `
  ) do ( echo %%g)

编辑: 删除了双引号,只保留一个。
但不确定如何在sed 命令中转义|

尝试在没有usebackq的情况下以这种方式对sed模式进行双引号:

for /f "delims=" %%g in (
  'TagRead.exe %%L Genre ^
  ^| sed -E "/Curtain^|Exit^|Spacer/^^!s~.*~Dance~" '
  ) do ( echo %%g)

编辑:
() 和命令sed 中包含许多引号的示例替换字符串'd'a'y''n'i'g'h't'

for /f "usebackq delims=" %g in ( 
  `echo 'd'a'y'^| sed "s/'d'a'y'/'n'i'g'h't'/"`
  ) do @( echo %g)

又一次将Winter\Summer 切换为Summer\Winter

for /f "usebackq delims=" %g in ( 
  `echo Winter\Summer^| sed -r "s/(.*)\\(.*)/\2\\\1/"`
  ) do @( echo %g)

【讨论】:

  • 你可能需要双引号,即^^^|
  • @HarryJohnston 似乎有 7 ^ 它可以工作 @for /f "usebackq delims=" %g in ( `echo yes^^^^^^^|no ^| findstr /c:"yes|no"` ) do ( @echo %g)
  • 三引号,对。做得好!回想起来,我可以看到为什么这是必要的:第一遍处理整行,第二遍处理反引号内的命令,第三遍处理管道之前的命令,即,此时echo yes^|no .
  • 这种方式也可以@for /f "delims=" %g in ( 'echo yes^^^^^^^|no ^| sed "s/yes|no/no|yes/"' ) do ( @echo %g)
  • @aschipfl - 与 FOR /F 一起使用时,单引号永远不需要转义。最外面的单引号分隔命令字符串,任何内部单引号都可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2018-03-19
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多