2013-04-04 42 views
3

我正在嘗試使用cmd的forfiles來執行類似Get Visual Studio to run a T4 Template on every build的操作來轉換VS2008中的每個模板。爲什麼forfiles吞下命令的第一個參數?

如果我執行

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 

documentation我已經能夠找到相當稀疏,我沒有看到這個任何提及的可能性。這只是一個晦澀的錯誤,或者我錯過了什麼?

+0

有趣。我在網上看到的所有樣本都使用'/ c「cmd/c ...」';他們都沒有直接調用一個單獨的exe文件。 – 2013-04-04 17:35:47

+1

奇怪。我發現如果前兩個參數中的任何一個都是EXE,那麼EXE將運行並接收其餘參數(即param3 +)。但是,如果參數是.BAT,那麼SECOND將運行,接收參數3+ – Magoo 2013-04-04 17:49:12

+0

@PeterWright,有趣的觀察。這似乎稍微複雜一些。只查看第二個參數是'exe'的情況:如果第一個參數不是文件,我會得到'ERROR:系統找不到指定的文件.'。如果第一個參數是例如我得到一個文本文件'錯誤:「test.txt」不是一個有效的可執行文件。「因此,真正有效的唯一虛擬文件是現有的'.bat'或'.cmd'文件。離奇。 – 2013-04-05 10:12:06

回答

3

這似乎是一個錯誤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" 
+0

這裏'@'字符的用途是什麼?我想使用帶有可執行文件路徑的'FORFILES',並且無法使其工作。這就像'@'字符啓用了我已經嘗試使用的'\''',但沒有'@'並且沒有成功。是否有一個地方可以獲得關於此屬性的更多信息?謝謝 – 2017-09-11 19:17:05

+0

對不起,我可以別忘了,我經常不使用cmd:首選我使用cygwin bash。 – 2017-09-11 21:05:24

0

我重複了forfiles中的行爲。您可以解決使用CMD/C命令之前,或者你可以過渡到PowerShell中,其中等效命令會是這樣的(未測試):

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

比爾

+0

我不認爲PowerShell是一個選項(除非我從'cmd'調用它),因爲VS2008將我給它的命令轉儲到批處理文件中執行。 – 2013-04-04 17:55:55

0

我一直在爲此而努力,以及。我找到的解決方法是在命令和第一個參數之間添加一個額外的空格!那麼,我要怎樣做:

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

蟒蛇試圖找到文件「ARG1」來執行,但如果我只是將其更改爲:

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

這實際工作!

相關問題