2

LOG ファイル内の文字列を検索するバッチ ファイルを作成しています。文字列には、2 つの静的部分と 2 つの動的部分が含まれます。動的部分は、実行時に入力するものです。バッチ スクリプト自体で静的部分と動的部分を連結し、ファイル内で検索します。

たとえば、静的文字列が「hello world |」および「|」の場合

動的文字列は「2013」と「2014」です。最終的な文字列は次のようになります

finalstring= ハローワールド | 2013年 | 2014年

二重引用符をなくすために、遅延展開を使用しています。以下は私のコードです:

@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
echo %mydate%


setlocal DisableDelayedExpansion
set "str=%~1"
setlocal EnableDelayedExpansion
echo !str!


setlocal DisableDelayedExpansion
set "str2=%~2"
setlocal EnableDelayedExpansion
echo !str2!



setlocal DisableDelayedExpansion
set "string1=hello world | "
set "string1=%~string1"
setlocal EnableDelayedExpansion
echo !string1!


setlocal DisableDelayedExpansion
set "pipesign= | "
set "pipesign=%~pipesign"
setlocal EnableDelayedExpansion
echo !pipesign!


:concat 
set "finalstring=%string1%%str%"
set "finalstring2=%finalstring%%pipesign%"
set "finalstring3=%finalstring2%%str2%"

echo %finalstring3%
:concat

findstr %finalstring3% C:\test\log20132502

私のバッチファイルの出力は次のとおりです。

2013-02-25
2013
2014
'2013' is not recognized as an internal or external command,operable program or batchfile

私の仮定は、文字列を連結するエラーがあり、引数が「最終文字列」で適切に呼び出されていないことです。

誰でもこれで私を助けてもらえますか?

前もって感謝します!

4

1 に答える 1

0

遅延展開のオンとオフを切り替える必要がある場合もありますが、その回数を最小限に抑えるようにコードを構成するようにしてください。あなたのコードは行き過ぎています。

%~varを使用して、変数値から囲み引用符を削除することはできません。これは、 のようにパラメーター、%~1または のように FOR 変数に対してのみ機能します%%~A。コードを記述した方法では、引用符を削除する必要はありません。set "var=value"には代入時に値を保護するための引用符がありますが、引用符は値に含まれません。

エラー メッセージは、FINDSTR 行内でパイプを引用する (またはエスケープする) 必要があるという事実に由来します。

FINDSTR は、検索文字列をスペースで区切られた複数の検索文字列に分割します。検索文字列内にスペースを含めたいので、FINDSTR/C:"search string"オプションが必要です。

上部の日付処理の目的がわかりませんが、保存しました。

おそらく、2013とはパラメータおよび2014として渡されます。%1%2

コードは次のように簡略化できると思います。

@echo off
setlocal enableDelayedExpansion
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
echo %mydate%

set "mySearch=hello world | %~1 | %~2"
echo !mySearch!

findstr /c:"!mySearch!" c:\test\log20132502

%1またはの値に%2が含まれる可能性がある場合!、 の代入中に遅延展開によって値が破損しますmySearch。その場合は、遅延展開を切り替えると役立ちます。

@echo off
setlocal disableDelayedExpansion
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
echo %mydate%

set "mySearch=hello world | %~1 | %~2"
setlocal enableDelayedExpansion
echo !mySearch!
endlocal

findstr /c:"!mySearch!" c:\test\log20132502

しかし、検索文字列の出力はデバッグ目的のためだけだと思います。変数や検索文字列の出力が本当に必要ない場合、コードは次のようになります。

@echo off
setlocal disableDelayedExpansion
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
echo %mydate%

findstr /c:"hello world | %~1 | %~2" c:\test\log20132502
于 2013-02-25T20:09:05.177 に答える