1

CSS特定のディレクトリにファイルをコピーするバッチ スクリプトを作成しましたが、コピー先ディレクトリでファイルを開くと感嘆符が削除されるCSSという問題があります。

元の CSS には、次のような感嘆符付きのスタイルが含まれています。

.foo
{
   color: pink !important;
}

私のCSSの結果は

.foo
{
   color: pink important;
}

私はこれの根本的な原因を調べ、以下に基づいて調べました:感嘆符がバッチファイルで常に削除されている

しかし、私の場合、遅延拡張を無効にする必要がある場所がわかりません。

参考までに、私のバッチは次のことを行っています:

  1. コンマで区切られたテーマ文字列ごとに、特定の文字列に一致する行番号の開始番号と終了番号を見つけます。

  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

アップデート

以下は、アドバイスに基づいて機能する私のソリューションです。違いは、指示に従って、スクリプトの先頭で 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
4

1 に答える 1

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

だから、私が言えるのは「うまくいく!」ということだけです。

于 2013-06-28T17:50:00.113 に答える