Windows批处理 – 延迟扩展删除感叹号

我写了批处理脚本将CSS文件复制到某个目录,问题是当我打开目标目录中的CSS文件时,感叹号被删除

原始的CSS包含带有感叹号的样式,例如:

 .foo { color: pink !important; } 

我的CSS结果变成了

 .foo { color: pink important; } 

我研究了这个问题的根源,并基于: 在batch file中不断移除感叹号

但我无法弄清楚我需要在哪里禁用延迟扩展。

仅供参考,我的批处理是:

  1. 对于以逗号分隔的每个主题string,find匹配特定string的行号的开头和结尾。

  2. 现在我有开始和结束行号(例如500和1000)

  3. 复制除500行和1000行之外的文件内容

  4. 最终文件被复制到目标目录

请让我知道,如果你需要更多的澄清,在此先感谢。

批次(片段):

 set themes=Platinum,Granite,Sun,Sky,Burgundy,Leaf,Twilight,Sharepoint 2010,Sharepoint 2013 rem Directory that contains theme css files set RUNTIME_DEST=%K2DIR%\K2 SmartForms Runtime\Styles\Themes REM Do something with each substring call :parse "%themes%" goto :eof :parse setlocal for %%a in ("%themes:,=" "%") do ( call :getLineNumber %%a ) endlocal goto :eof :getLineNumber setlocal echo file name is %~1 set filename=%~1 rem Get start and end line numbers of the unwanted section for /F "delims=:" %%a in ('findstr /N /C:"PickerCollectionThemeStart" "%RUNTIME_DEST%\%filename%.css"') do ( set start=%%a ) for /F "delims=:" %%a in ('findstr /N /C:"PickerCollectionThemeEnd" "%RUNTIME_DEST%\%filename%.css"') do ( set end=%%a ) if not defined start ( echo start not defined... set start=0 set end=0 ) echo start val = !start! echo end val = !end! call :resetTheme "%filename%" "%start%" "%end%" endlocal goto :eof :resetTheme setlocal set filename=%~1 set start=%~2 set end=%~3 echo %fileName% echo %start% echo %end% echo --------------- rem Create a copy file to modify xcopy "%RUNTIME_DEST%\%filename%.css" "%cd%\Batch_tmp" /y /z /r echo creating tmp copy... rem Rename the file so we can modify and create finalized version ren "Batch_tmp\%fileName%.css" "%fileName%_tmp.css" echo coping all line except section... rem Copy all lines, except the ones in start-end section (for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "Batch_tmp\%fileName%_tmp.css"') do ( if %%a lss %start% echo(%%b if %%a gtr %end% echo(%%b )) > Batch_tmp\!fileName!.css echo copying to blackpearl dir rem Finally move the css over to blackpearl directory setlocal DisableDelayedExpansion xcopy "Batch_tmp\%fileName%.css" "%RUNTIME_DEST%" /y /z /r endlocal endlocal goto :eof :eof pause 

UPDATE

以下是我的解决scheme,基于build议。 不同的是,按照说明,在脚本开始处设置EnableDelayedExpansion,以便对整个批处理作用域产生影响,然后仅在适用的情况下将DisableDelayedExpansion设置为DisableDelayedExpansion。

 set themes=Platinum,Granite,Sun,Sky,Burgundy,Leaf,Twilight,Sharepoint 2010,Sharepoint 2013 rem Directory that contains theme css files set RUNTIME_DEST=%K2DIR%\K2 SmartForms Runtime\Styles\Themes REM Do something with each substring call :parse "%themes%" goto :eof :parse setlocal for %%a in ("%themes:,=" "%") do ( echo ------------------------ call :getLineNumber %%a ) endlocal goto :eof :getLineNumber setlocal echo file name is %~1 set filename=%~1 rem Get start and end line numbers of the unwanted section for /F "delims=:" %%a in ('findstr /N /C:"PickerCollectionThemeStart" "%RUNTIME_DEST%\%filename%.css"') do ( set start=%%a ) for /F "delims=:" %%a in ('findstr /N /C:"PickerCollectionThemeEnd" "%RUNTIME_DEST%\%filename%.css"') do ( set end=%%a ) if not defined start ( echo start not defined... set start=0 set end=0 ) echo start val = !start! echo end val = !end! call :resetTheme "%filename%" "%start%" "%end%" endlocal goto :eof :resetTheme setlocal set filename=%~1 set start=%~2 set end=%~3 echo %fileName% echo %start% echo %end% rem Create a copy file to modify xcopy "%RUNTIME_DEST%\%filename%.css" "%cd%\Batch_tmp" /y /z /r echo creating tmp copy... rem Rename the file so we can modify and create finalized version ren "Batch_tmp\%fileName%.css" "%fileName%_tmp.css" echo coping all line except section... rem Copy all lines, except the ones in start-end section (for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "Batch_tmp\%fileName%_tmp.css"') do ( setlocal DisableDelayedExpansion if %%a lss %start% echo(%%b if %%a gtr %end% echo(%%b endlocal )) > Batch_tmp\!fileName!.css echo copying to blackpearl dir rem Finally move the css over to blackpearl directory xcopy "Batch_tmp\%fileName%.css" "%RUNTIME_DEST%" /y /z /r endlocal goto :eof :eof 

Solutions Collecting From Web of "Windows批处理 – 延迟扩展删除感叹号"

我把它放在这里是我你…

 (for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "Batch_tmp\%fileName%_tmp.css"') do ( SETLOCAL DISABLEDELAYEDEXPANSION if %%a lss %start% echo(%%b if %%a gtr %end% echo(%%b ENDLOCAL )) > Batch_tmp\!fileName!.css 

但没有保证…


令人失望的结果由OP 🙁

这是我的测试设置:

 @ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION :: force directories, start and end SET runtime_dest=c:\temp SET filename=test SET start=2 SET end=4 :: create batch_temp & clear MD "%cd%\Batch_tmp" 2>NUL >NUL DEL "%cd%\Batch_tmp\*?*" /F /Q :: make copy of original .css xcopy "%RUNTIME_DEST%\%filename%.css" "%cd%\Batch_tmp" /y /z /r echo creating tmp copy... rem Rename the file so we can modify and create finalized version ren "Batch_tmp\%fileName%.css" "%fileName%_tmp.css" echo coping all line except section... rem Copy all lines, except the ones in start-end section (for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "Batch_tmp\%fileName%_tmp.css"') do ( if %%a lss %start% echo(%%b if %%a gtr %end% echo(%%b )) > Batch_tmp\!fileName!.css rem Copy all lines, except the ones in start-end section (for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "Batch_tmp\%fileName%_tmp.css"') do ( SETLOCAL disabledelayedexpansion if %%a lss %start% echo(%%b if %%a gtr %end% echo(%%b ENDLOCAL )) > Batch_tmp\!fileName!WITHSETLOCAL_ENDLOCAL.css ECHO ============================ ECHO Batch_tmp\%fileName%_tmp.css TYPE Batch_tmp\%fileName%_tmp.css ECHO =======^^^^^^^^=================this is the original file ECHO Batch_tmp\%fileName%.css TYPE Batch_tmp\%fileName%.css ECHO =======^^^^^^^^=================this is the result with delayed expansion enabled ECHO Batch_tmp\%fileName%WITHSETLOCAL_ENDLOCAL.css TYPE Batch_tmp\%fileName%WITHSETLOCAL_ENDLOCAL.css ECHO ========^^^^^^^^================this is the result with the advised setlocal/ENDLOCAL IN place GOTO :eof 

和结果:

 C:\temp\test.css 1 File(s) copied creating tmp copy... coping all line except section... ============================ Batch_tmp\test_tmp.css .foo omit me and me and me { color: pink !important; } =======^^^^=================this is the original file Batch_tmp\test.css .foo { color: pink important; } =======^^^^=================this is the result with delayed expansion enabled Batch_tmp\testWITHSETLOCAL_ENDLOCAL.css .foo { color: pink !important; } ========^^^^================this is the result with the advised setlocal/ENDLOCAL IN place 

所以我只能说“适合我!”