为什么forfiles要接受命令的第一个参数?

2024-09-23 22:25:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试做类似于Get Visual Studio to run a T4 Template on every build的操作,使用cmd的forfiles来转换VS2008中的每个模板。在

如果我执行

forfiles /m "*.tt" /s /c "\"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file"

然后我得到TextTransform.exe的错误消息(解释作为参数传递的内容的文本屏幕)。在

如果我执行

^{pr2}$

那么它就完美地工作了。在

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

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

输出

2 arguments supplied
#1: 2
#2: 3

我能找到的documentation非常稀少,我不认为有任何可能提到这一点。只是一个模糊的错误,还是我遗漏了什么?在


Tags: torun程序参数get错误templateexe
3条回答

这似乎是forfiles调用.exes的一个缺陷。我凭直觉扩展了我的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"

因此,最合适的解决方法是将可执行文件的名称加倍:

^{pr2}$

另一种解决方法是使用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”,但如果我将其更改为:

^{pr2}$

这真的很管用!在

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

get-childitem . -filter "*.tt" -recurse | foreach-object {
  & "${ENV:CommonProgramFiles(x86)}\Microsoft Shared\TextTemplating\1.2\TextTransform.exe" "`"$($_.Name)`""
}

比尔

相关问题 更多 >