0

以下是应该在 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%%"
        )
    )
)
4

1 回答 1

1

它与 Visual Studio 无关,它是标准的批处理初学者错误。
如您所料,括号中的百分比扩展不起作用。
它在解析完整块时展开,在执行任何行之前。

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

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

setlocal EnableDelayedExpansion
if %1==Release (

    if exist %2 (
        set location=%2
        echo !location!
        ....
于 2012-11-15T20:30:21.013 回答