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行では同じように機能しますが、バッチを2回開始すると機能しているように見えますが、まだ設定されているため、正しい値しか表示されません。

それを解決する方法は?
それ(パーセント拡張)を使用せず、代わりに遅延拡張を使用してください!

setlocal EnableDelayedExpansion
if %1==Release (

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