Batch file 为什么forfiles会接受命令的第一个参数?

Batch file 为什么forfiles会接受命令的第一个参数?,batch-file,cmd,Batch File,Cmd,我试图做一些类似于使用cmd的forfiles来转换VS2008中的每个模板的事情 如果我执行 forfiles /m "*.tt" /s /c "\"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file" 然后我得到textcransform.exe的错误消息(解释如何将其作为参数传递的文本屏幕) 如果我改为执行 forfiles /m "*.tt" /s /c "cmd

我试图做一些类似于使用cmd的
forfiles
来转换VS2008中的每个模板的事情

如果我执行

forfiles /m "*.tt" /s /c "\"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file"
然后我得到
textcransform.exe
的错误消息(解释如何将其作为参数传递的文本屏幕)

如果我改为执行

forfiles /m "*.tt" /s /c "cmd /c echo Transforming @path && \"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file"
然后它就完美地工作了

为了调试它,我创建了一个名为
debugargs
的简单命令行程序,它只打印它接收的参数数量及其值。然后一些实验表明,直接将命令传递给
forfiles
的第一种形式会导致第一个参数被吞没。例如

forfiles /m "*.tt" /s /c "debugargs.exe 1 2 3"
输出

2 arguments supplied
#1: 2
#2: 3

我所能找到的资料非常稀少,我不认为有可能提到这一点。这只是一个模糊的bug,还是我遗漏了什么?

我也在forfiles中复制了这个行为。您可以在执行命令之前使用cmd/c解决此问题,也可以转换到PowerShell,其中等效的命令如下(未测试):


Bill

这似乎是
forfiles
调用
.exe
s的方式中的一个错误。凭直觉,我扩展了我的
debugargs
程序来打印完整的命令行

X:\MyProject>forfiles /m "*.tt" /s /c "debugargs.exe 1 2 @file"

2 arguments supplied
#1: 2
#2: Urls.tt
Full command line: 1 2 "Urls.tt"
因此,最合适的解决方法是将可执行文件名加倍:

forfiles /m "*.tt" /s /c "debugargs.exe debugargs.exe 1 2 @file"
另一种解决方法是使用
cmd/c
调用。但是,请注意,如果需要引用可执行文件的路径(例如,因为它包含空格),则需要一种额外的解决方法,即预先添加
@

forfiles /m "*.tt" /s /c "cmd /c @\"debugargs.exe\" 1 2 @file"

我也一直在努力解决这个问题。我发现的解决方法是在命令和第一个参数之间添加一个额外的空间!所以我想做的是:

FORFILES /s /m *.dll /c "python \"c:\path\to\script.py\" -t arg1 etc"
python试图找到要执行的文件“arg1”,但如果我将其更改为:

FORFILES /s /m *.dll /c "python  \"c:\path\to\script.py\" -t arg1 etc"

这确实有效

有趣。我在网上看到的所有示例都使用
/c“cmd/c…”
;它们都没有直接调用单独的exe。奇怪。我发现,如果前两个参数中的任何一个是EXE,那么EXE将运行并接收剩余的参数(即param3+),如果args是.BATs,那么第二个将运行,接收param3+@PeterWright,这是一个有趣的观察结果。它似乎稍微复杂一些。仅查看第二个参数为
exe
的情况:如果第一个参数不是文件,则出现
错误:系统无法找到指定的文件。
。如果第一个参数是一个文本文件,我会得到
错误:“test.txt”不是一个有效的可执行文件。
因此,唯一一个真正有效的虚拟文件是现有的
.bat
.cmd
文件。奇怪。我不认为PowerShell是一个选项(除非我从
cmd
调用它),因为VS2008将我给它的命令转储到批处理文件中执行。这里的
@
字符的用途是什么?我想使用带有包含空格的可执行文件路径的
for files
,但无法使其工作。这就像是
@
字符启用了
\“
的使用,我已经尝试过了,但是没有
@
也没有成功。有什么地方可以让我了解更多关于这个属性的信息吗?谢谢,我记不起来了。我根本不经常使用cmd:首选是cygwin bash。
FORFILES /s /m *.dll /c "python  \"c:\path\to\script.py\" -t arg1 etc"