質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.69%

.bat内のif文により、.batが途中で終了してしまう。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 708

zazabi

score 15

■環境
2003 リモート接続先サーバ
コマンドプロンプトの.batファイルとして使用します。

■目的
大目的:サービスが存在する場合、サービスを停止の後に削除する。その後、ある場合と無い場合共通のコマンドを流す。
小目的:サービスの検索結果をファイルに出力し、その中からサービスの名前の文字列検索をする。一致した場合、停止と削除コマンドを流す。

■困っている事
1.下記のコマンドを流した際、.batが途中で終わる。これはサービスの削除判定batを別のbatにしないと続行することができませんか?
2.下記のコマンドを流した際、:answer0と:answer1が両方とも出力されてしまいます。場合分けしたいのですが、修正や指摘をお願いします。

■コマンド

@echo off
set file=<出力先ファイル>
sc qc <サービス名> >"%file%"

rem 文字列検索
set keyword=<サービス名>
findstr %keyword% "%file%" > NUL
GOTO answer%ERRORLEVEL%
pause

:answer0
rem 検索文字列ありの場合
echo サービスが既にあります。
set /P STR_INPUT="既存のサービスをサービス一覧から削除します。削除しない場合、新しいサービスのインストールは行われません。インストールしてよろしいですか?(y/n): "
IF "%STR_INPUT%" == "y" (
    echo "%STR_INPUT%:処理続行"
    echo 既存のサービスを削除します。
    echo サービスのスタートアップの種類を手動にします。
    sc  config <サービス名> start= demand
    echo サービスを停止します。
    sc Stop <サービス名>
    echo サービスを削除します。
    sc.exe delete <サービス名>
) ELSE (
    echo "%STR_INPUT%:処理中止"
    echo バッチファイルを停止します。
    pause
    exit
)
goto end
exit /b

:answer1
rem 検索文字列無しの場合 or エラーが発生した場合
echo サービスはありません。
goto end

:end
rem 下にコマンドが続きますが、関係ないので割愛。

endlocal
pause

追記

コマンドを一部修正しました。かなり省略してあります。

GOTO answer%ERRORLEVEL%
:answer0
goto end
:answer1
goto end
:end
rem 残りのコマンド


にしてみて期待通りに動くようになりましたが、これで良かったのか不安です……。
以上、わかることがあればコメントをお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Y.H.

    2019/09/06 09:12

    「コマンドプロンプトでコマンド実行結果を変数に格納したい」
    という質問タイトルと内容が全く関係ないように思えるのですが・・・
    質問内容がわかるタイトルに変更してください。

    キャンセル

  • zazabi

    2019/09/06 09:16

    gentaro さん
    コメントありがとうございます。
    あんまり気にしていませんでしたが、こちらの方が確かにわかりやすいですね。
    今後は利用しようかと思います。

    otnさん
    コメントありがとうございます。
    findstr文、if文、:answer0、:answer1が流れた後に終わってしまいます。この後にもコマンドは続いていますがそこで終わってしまいます。

    キャンセル

  • zazabi

    2019/09/06 09:20

    Y.H.さん
    コメントありがとうございます。
    よく見たらそうですね…、本文の内容と合うように訂正させていただきました。

    キャンセル

回答 3

+1

質問のポイントと別ですが、

sc qc サービス名 >NUL
if not errorlevel 1 (
  サービスがあるときの処理
) else (
  サービスがないときの処理
)


と書くのが普通でしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/09 11:40

    コメントありがとうございます。
    提案していただいたコマンドの方がわかりやすいですね。
    if文でどう直そうか悩んでいたのでとても助かります!

    キャンセル

check解決した方法

0

GOTO answer%ERRORLEVEL%
:answer0
goto end
:answer1
goto end
:end
rem 残りのコマンド


上記で:answer0→:endもしくは:answer1→:endと流す事が出来ました。
判別文は for文で「findstr %keyword% "%file%"」の結果を変数に入れて、そのあとif文で分かりやすくなるよう修正します。それはトピック違いなので、裏で修正します。

コメントをしていただいた皆様ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

にしてみて期待通りに動くようになりましたが、これで良かったのか不安です……。

ちゃんと読んでないけど修正後に期待通り動いているとのことなので、問題は解決してる気がしますが…

ラベルをGOTO answer%ERRORLEVEL%のような書き方で分岐するのは直感に反する(正直こんなこと出来るの知らなかった)ので、普通にIF文でそれぞれのラベルに飛ぶ方が良い気が。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/06 11:46

    コメントありがとうございます。
    if文の方が分かりやすいと同じく思いましたので、修正します。
    トピックの問題自体は解決しているのでそのまま閉じようかと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.69%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる