Visual Studio和cmd.exe如何以及为何以不同方式处理批处理文件

时间:2012-11-15 17:44:53

标签: visual-studio batch-file cmd pre-build-event

以下是一个程序应该作为VS中的预构建事件运行。它直接从命令行工作,但不在VS中工作。

@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 个答案:

答案 0 :(得分:1)

它与visual studio无关,它是标准的批量初学者bug 如您所料,百分比扩展在括号中不起作用 在解析完整块之前,在执行任何行之前,它会扩展。

所以%location%被扩展为空,它进入块之前的值 在cmd行,它以相同的方式工作,但是如果你开始批次两次,它似乎可以工作,但你只看到正确的值,因为它仍然设置。

如何解决? 不要使用它(扩展百分比),而是使用延迟扩展!

setlocal EnableDelayedExpansion
if %1==Release (

    if exist %2 (
        set location=%2
        echo !location!
        ....