3

我正在尝试执行类似于Get Visual Studio 的操作,以使用 cmd在每个构建上运行 T4 模板forfiles来转换 VS2008 中的每个模板。

如果我执行

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

然后我收到TextTransform.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

我能够找到的文档非常稀少,我认为没有任何提及这一点的可能性。它只是一个不起眼的错误,还是我错过了什么?

4

3 回答 3

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"

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

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

另一种解决方法是调用 with cmd /c。但是,请注意,如果您需要引用可执行文件的路径(例如,因为它包含一个空格),则需要额外的 prepending 解决方法@

forfiles /m "*.tt" /s /c "cmd /c @\"debugargs.exe\" 1 2 @file"
于 2013-04-05T10:59:20.733 回答
0

我也在 forfiles 中重现了这种行为。您可以在命令之前使用 cmd /c 来解决问题,或者您可以转换到 PowerShell,其中等效命令将是这样的(未经测试):

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

账单

于 2013-04-04T17:50:01.153 回答
0

我也一直在为此苦苦挣扎。我发现的解决方法是在命令和第一个参数之间添加一个额外的空格!所以我想做的地方:

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"

这确实有效!

于 2013-10-13T03:24:32.193 回答