下面是一个程序应该在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!
....