質問: ### 前提・実現したいこと for /F "usebackq tokens=2" %a in (`tasklist /fi "IMAGENAME eq AA*" ^| findstr "[0-9]"`) do (taskkill /f /PID %a) 上記のコマンドを使ってコマンドプロンプトからAAが含まれるアプリケーションを taskkillしています。ただ上記のコマンドだと対象のアプリケーションが立ち上がっている場合でも、そうでない場合でも動いてしまいます。 defined等を使って、対象のアプリケーションが立ち上がっている場合のみtaskkillを 行いたいです。立ち上がっていない場合はメッセージを出したいです。 そこでこのように書きましたが、ifの使い方がおかしいとエラーが出ます。 for /F "usebackq tokens=2" %a in (`tasklist /fi "IMAGENAME eq AA*" ^| findstr "[0-9]"`) if defined %a% ( do (taskkill /f /PID %a)) else ( echo AA*.EXE は立ち上がっていません。) defineの使い方がおかしいのでしょうか。
回答: AAで始まるプログラムが、一つも立ち上がってないと、`tasklist`の出力が > > 情報: 指定された条件に一致するタスクは実行されていません。 > > > になり、`findstr "[0-9]"`するとゼロ行なので、`do`の後は一度も実行されません。 つまり、 > > ただ上記のコマンドだと対象のアプリケーションが立ち上がっている場合でも、そうでない場合でも動いてしまいます。 > > > は間違いですので、何らかの勘違いがあります。 追記 == > > AA*が立ち上がっている場合にはtaskkill,アプリケーションが立ち上がってない場合にはには(echo AA*.EXE は立ち上がっていません。)を行いたいです。 > > > ということを、ゼロから作ると、 ``` tasklist /fi "IMAGENAME eq AA*" | findstr "[0-9]" >NUL if errorlevel 1 ( echo AA*.EXE は立ち上がっていません。 ) else ( taskkill /fi "IMAGENAME eq AA*" ) ```