web-dev-qa-db-ja.com

バッチプログラムは変数内の文字列を検索します

私は多くの場所で解決策を見つけようとしましたが、具体的な答えを見つけることができませんでした。

バッチスクリプトを作成しています。以下はこれまでの私のコードです

    @echo off
    SETLOCAL EnableDelayedExpansion
    cls
    for /f "delims=" %%a in ('rasdial EVDO cdma cdma') do set "ras=!ras! %%a"

    findstr /C:"%ras%" "already"

    if %errorlevel% == 0 
    (
        echo "it says he found the Word already"
    )
    else
    (
        echo "it says he couldn't find the Word already"
    )

出力:

    FINDSTR: Cannot open already
    The syntax of the command is incorrect.

変数「ras」で「already」という単語を見つけようとしています。

問題はfindstr/C: "%ras%" "already"にあるようです

findstr "%ras%" "already"を使用してみましたが、それも機能しません。

9
Sid1024

コードには2つの問題があります。

1つ目は、findstrの仕組みです。入力の各行について、その行に指定されたリテラルまたは正規表現が含まれているかどうかがチェックされます。テストされる入力行は、ファイルまたは標準入力ストリームから読み取ることができますが、コマンドラインの引数から読み取ることはできません。行をfindstrコマンドにパイプする最も簡単な方法

echo %ras% | findstr /c:"already" >nul

2番目の問題は、ifコマンドの記述方法です。開始括弧は条件と同じ行にある必要があり、else句は最初の終了括弧と同じ行にある必要があり、else句の開始括弧はelse句と同じ行( ここ を参照)

if condition (
    code
) else (
    code 
)

ただし、変数に文字列が含まれているかどうかをテストするには、簡単に実行できます。

if "%ras%"=="%ras:already=%" (
    echo already not found
) else (
    echo already found
)

これは、変数の値が、文字列alreadyが何にも置き換えられていない同じ値に等しいかどうかをテストします。

変数の編集/置換に関する情報については、 ここ を参照してください。

10
MC ND

私はすでに解決策を見つけたようです。

    echo %ras% | findstr "already" > nul

と@Karata私は使用できません

    rasdial EVDO cdma cdma | findstr already > NUL

複数のケースのスクリプトを書いていて、出力を変数に格納したいので..とにかくありがとう。

2
Sid1024

「コマンドの構文が正しくありません。」バッチコマンドラインに存在しない「else」について報告されます。

For

findstr /c:"str" file

ここで、strは検索するリテラル、fileは検索を実行するファイル名です。したがって、これは要件を満たしていません。

以下が必要だと思います。

rasdial EVDO cdma cdma | findstr already > NUL

if %errorlevel% EQU 0 (
    echo "it says he found the Word already"
)

if %errorlevel% NEQ 0 (
    echo "it says he couldn't find the Word already"
)
0
Karata