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

时间:2013-06-28 17:32:52

标签: windows batch-file

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

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

.foo
{
   color: pink !important;
}

我的CSS结果变为

.foo
{
   color: pink important;
}

我研究了这个的根本原因并基于:exclamation point being removed constantly in batch file

但在我的情况下,我无法弄清楚我需要在哪里禁用延迟扩展。

仅供参考,我的批次正在做以下事项:

  1. 对于以逗号分隔的每个主题字符串,查找与某些字符串匹配的行号的开头和结尾。

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

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

  4. 将已完成的文件复制到目标目录

  5. 如果您需要更多说明,请通知我们。

    批量(摘录):

    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
    

1 个答案:

答案 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

所以 - 我只能说“为我工作!”