我编写了批处理脚本来将CSS
文件复制到某个目录,问题是当我打开目标目录中的CSS
文件时,感叹号被删除了。
原始CSS包含带感叹号的样式,例如:
.foo
{
color: pink !important;
}
我的CSS结果变为
.foo
{
color: pink important;
}
我研究了这个的根本原因并基于:exclamation point being removed constantly in batch file
但在我的情况下,我无法弄清楚我需要在哪里禁用延迟扩展。
仅供参考,我的批次正在做以下事项:
对于以逗号分隔的每个主题字符串,查找与某些字符串匹配的行号的开头和结尾。
现在我有开始和结束行号(例如500和1000)
复制除第500行和第1000行之外的文件内容
将已完成的文件复制到目标目录
如果您需要更多说明,请通知我们。
批量(摘录):
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
更新
以下是我的解决方案,根据建议工作。不同的是,按照指示, 在脚本开头设置EnableDelayedExpansion以对整个批处理范围产生影响,然后仅在适用的位置设置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
答案 0 :(得分:4)
我把它放在这里,我是你......
(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
所以 - 我只能说“为我工作!”