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



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

@echo off
:: Direct From cmd.exe
:: "G:Google DriveGitHubtoolsetSitepre-build.bat" Release "G:Google DriveGitHubtoolsetSiteWeb"
:: 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..SharedLibsdotless%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..SharedLibsClosure Compilercompiler.jar" --js "%%a" --js_output_file "%%newFilename:.closure.js=.min.js%%"
        )
    )
)

它与Visual Studio无关,它是标准的批量初学者错误。
百分比扩展在括号中不起作用,如预期的那样。
当解析整个块时,在执行任何行之前,它会扩展。

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

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

setlocal EnableDelayedExpansion
if %1==Release (
    if exist %2 (
        set location=%2
        echo !location!
        ....

最新更新