如何在`forfiles`中避免`@`变量的替换?

3

我正在使用类似以下命令行的forfiles命令(Windows 7 x64):

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

我该如何避免替换@relpath(当前迭代项的相对路径)以获取文字上的@relpath输出? (…或任何其他@变量?)
到目前为止,我尝试了以下几种方法,但都没有成功:
  • \:在\之前处理@,因此\@relpath无效,而扩展输出只是在前面加上\
  • ^:声明^@除了^消失外没有任何效果;写^^@也没有帮助,然后扩展输出中仍有一个^
  • 0xHH:令人惊讶的是,针对forfiles的十六进制数0x40替换也不起作用,似乎这是在变量解析之前完成的;
  • @@:将@加倍可以保留第一个@,就是这样。
2个回答

3
您可以使用延迟扩展。
forfiles /P "C:\temp" /M "st*.txt" /C "cmd /v:on /C set r=0x40 & echo !r:~0,1!relpath"

或者你可以使用百分数扩展。

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

很好的方法!在第一种选项中,如果您省略set r=0x40后面的空格或将其括在()中,像!r!这样的简单扩展也可以正常工作... - aschipfl

2

我刚刚发现了更简单的方法:

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

请注意在@符号之后的^符号。

这似乎是最好的方法。 - jeb

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