使用forfiles
批处理命令,有时@path
变量和@file
变量是相同的,有时它们是不同的。这看起来像是一个错误。
举例说明 - 设置:
md test_subfolder
echo Hello>test_subfolder\test.txt
现在@path
和@file
不同,就像您期望的那样:
forfiles /p test_subfolder /c "cmd /c echo CD: [%cd%] PATH: [@path] FILE: [@file]"
产量:
CD: [D:\] PATH: ["D:\test_subfolder\test.txt"] FILE: ["test.txt"]
现在,尝试使用@path
覆盖文件。这就是你所期望的。
forfiles /p test_subfolder /c "cmd /c echo Goodbye>@path"
type test_subfolder\test.txt
结果:
Goodbye
使用@file
代替@path
尝试相同的事情:
forfiles /p test_subfolder /c "cmd /c echo Farewell>@file"
此应该在根目录中创建一个新文件,并保持子文件夹中的文件不变。但相反,它的行为与@path
的行为相同。
检查根文件夹中的文件:
dir test.txt
结果:
Volume in drive D is Recovery
Volume Serial Number is AE9D-4134
Directory of D:\
File Not Found
查看子文件夹:
type test_subfolder\test.txt
结果:
Farewell
这是使用Windows 7专业版 - 我不知道它在其他版本中如何工作。
如何让@file
以我期望的方式行事?
答案 0 :(得分:1)
这不是一个错误。真正的问题是解析器扩展%CD%
,它立即完成,因此您可以看到您正在使用的cmd
实例的当前目录。
cmd
打开的forfiles
实例接收/p
处提供的路径作为当前目录。要查看此内容,请将命令行更改为:
forfiles /p test_subfolder /c "cmd /c echo CD: [0x25cd0x25] PATH: [@path] FILE: [@file]"
0x25
表示十六进制。 %
符号的代码,因此%cd%
的扩展不会立即完成,而是转移到"内部" cmd
实例。
这将向您显示echo
命令实际在D:\test_subfolder
中执行,因此@file
的{{1}}变量扩展行为正确。因此输出将是:
forfiles
这解释了为什么您的代码行CD: [D:\test_subfolder] PATH: ["D:\test_subfolder\test.txt"] FILE: ["test.txt"]
在forfiles /p test_subfolder /c "cmd /c echo Farewell>@file"
中执行时(over-)写入文件D:\
而不是创建新文件D:\test_subfolder\test.txt
。< / p>
答案 1 :(得分:0)
forfiles /p test_subfolder /c "cmd /c echo So Long>%CD%@file"
type test.txt
结果:
So Long
答案 2 :(得分:0)
forfiles /p test_subfolder /c "cmd /c echo So Long>%CD%\@file"
命令对我有用, [请注意我在%CD%后使用了“\”] ,你需要写一个子目录中的文件,你是试图在子文件夹外执行上面的命令,可能是因为你感觉@path和@file之间的区别