Batch file 为什么forfiles会接受命令的第一个参数?
我试图做一些类似于使用cmd的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
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"