如何转义`forfiles`中的`@`变量替换?

问题描述 投票:0回答:2

我正在使用像这样的

forfiles
命令行(Windows 7 x64):

forfiles /P "C:\root" /M "*.txt" /C "cmd /C echo @relpath"

如何逃避替换

@relpath
(当前迭代项的相对路径)以获得字面意义的
@relpath
输出? (...或任何其他
@
变量?)


到目前为止,我尝试了以下方法,但没有成功:

  • \
    @
    似乎在
    \
    之前处理,因此
    \@relpath
    不起作用,而是扩展输出前面带有
    \
  • ^
    :说出
    ^@
    除了
    ^
    消失外没有任何效果;写
    ^^@
    没有帮助,那么扩展输出中仍保留一个
    ^
  • 0xHH
    :令人惊讶的是(对我来说),
    forfiles
    特定的十六进制数字替换
    0x40
    也不起作用,似乎这是在变量解析之前完成的;
  • @@
    :将
    @
    加倍,保留第一个
    @
    ,就是这样;
batch-file for-loop cmd escaping forfiles
2个回答
3
投票

您可以使用延迟扩展

forfiles /P "C:\temp" /M "st*.txt" /C "cmd /v:on /C set at=@& echo !at!relpath"

或者您可以使用百分比扩展。

set "percent=%"
set "at=@"
forfiles /P "C:\temp" /M "st*.txt" /C "cmd /C echo %percent%at%percent%relpath"

另一种选择是插入回车符,回车符在输出之前被删除。

forfiles /P "C:\root" /M "*.txt" /C "cmd /C echo @0x0Drelpath"

2
投票

我刚刚找到了一个更简单的方法:

forfiles /P "C:\root" /M "*.txt" /C "cmd /C echo @^relpath"

注意

^
@
符号之后。

© www.soinside.com 2019 - 2024. All rights reserved.