2012-11-15 40 views
0

以下是程序應該作爲VS中的預生成事件運行。它直接從命令行工作,但不在VS中。Visual Studio和cmd.exe如何以及爲什麼以不同方式處理批處理文件

@echo off 
:: Direct From cmd.exe 
:: "G:Google Drive\GitHub\toolset\Site\pre-build.bat" Release "G:Google Drive\GitHub\toolset\Site\Web" 
:: From Visual Studio Pre-Build Event 
:: "$(SolutionDir)pre-build.bat" $(ConfigurationName) "$(ProjectDir)" 

if %1==Release (

    if exist %2 (
     set location=%2 
     set dotlessVersion=v1.3.1.0 

     :: Compress Less Files 
     for /r %location% %%a in (*.less) do (
      "%~dp0..\SharedLibs\dotless\%dotlessVersion%\dotless.Compiler.exe" -m -r "%%a" "%%~da%%~pa%%~na.min.css" 
     ) 

     :: Minify js Files 
     for /r %location% %%a in (*.closure.js) do (
      set newFilename=%%a 
      call java -jar "%~dp0..\SharedLibs\Closure Compiler\compiler.jar" --js "%%a" --js_output_file "%%newFilename:.closure.js=.min.js%%" 
     ) 
    ) 
) 
+1

它爲什麼不起作用?怎麼了?你在輸出窗口中看到了什麼? – SLaks

+0

輸出窗口中不顯示任何內容。如果我在'set location =%2'之後添加'echo Value:%location%',則輸出爲'Value:'。 cmd.exe將該變量輸出到回顯中。 – roydukkey

回答

1

它與visual studio無關,它是標準的批量初學者bug。
正如您所期望的那樣,百分比擴展在括號中不起作用。
在執行任何行之前,在完整塊被解析時,它會展開。

因此%location%被擴展爲空,它在進入塊之前的值。
在cmd線上它的工作方式是一樣的,但是如果你開始批處理兩次,它似乎可以工作,但你只能看到正確的值,因爲它仍然被設置。

如何解決?
不要使用它(擴展百分比),而是使用延遲擴展!

setlocal EnableDelayedExpansion 
if %1==Release (

    if exist %2 (
     set location=%2 
     echo !location! 
     .... 
相關問題