`forfiles`中的错误,'@ file`变量的错误扩展?

时间:2015-10-09 14:51:41

标签: batch-file for-loop cmd

使用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以我期望的方式行事?

3 个答案:

答案 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之间的区别