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

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

新規登録して質問してみよう
ただいま回答率
85.34%
バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

TortoiseSVN

TortoiseSVNは、フリーのSubversion(SVN)クライアントです。 Windowsのシェルエクステンションとしての機能を果たします。 Subversionのコマンドを実行せずに使用が可能です。

Windows 11

Windows 11は、Windows 10の後継バージョン。それまでのMetroデザインを廃止し、Fluentデザインを導入しています。スタートメニューの構成やウィンドウのデザインの変更の他、Androidアプリをネイティブに実行できます。

Q&A

解決済

1回答

271閲覧

【バッチ処理】エラーフラグがたってないのにエラー時の処理をしてる原因がわからない

Buretan

総合スコア33

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

TortoiseSVN

TortoiseSVNは、フリーのSubversion(SVN)クライアントです。 Windowsのシェルエクステンションとしての機能を果たします。 Subversionのコマンドを実行せずに使用が可能です。

Windows 11

Windows 11は、Windows 10の後継バージョン。それまでのMetroデザインを廃止し、Fluentデザインを導入しています。スタートメニューの構成やウィンドウのデザインの変更の他、Androidアプリをネイティブに実行できます。

0グッド

0クリップ

投稿2024/12/04 13:32

編集2024/12/04 20:49

実現したいこと

エラーフラグが立っていないときはエラーの処理をスルーして削除コマンドを実行してほしい。

発生している問題・分からないこと

TortoiseSVNの削除コマンドを実行するバッチを作成しました。

■動作
バッチを実行するとファイルパスが記載されたテキストファイル(dlt_list.txt)を読み込んで、上から順番に削除コマンドを実行するというものです。

dlt_list.txtの中身

削除コマンド実行前にファイルパスが合ってるか確認し、一致しないものが有る場合はエラーを吐きます。
エラー発生時は続行するかどうか(Y/N)の入力を求めます。

■参考
バッチとテキストファイルは同じフォルダに配置してます。

trunkがあるフォルダ

trunk配下のフォルダ

該当のソースコード

testbatch

1@echo off 2echo SVNリポジトリからファイルを削除します... 3 4REM TortoiseSVNのインストールディレクトリのパスを設定します 5set SVN_PATH="C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" 6 7REM 現在のバッチファイルのディレクトリを取得 8set CURRENT_DIR=%~dp0 9 10REM ログファイルのパスを設定します 11set LOG_DIR=%CURRENT_DIR%log 12if not exist "%LOG_DIR%" mkdir "%LOG_DIR%" 13set LOG_FILE=%LOG_DIR%\log_%date:~-10,4%%date:~-5,2%%date:~-2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt 14 15echo ファイルパスの確認を開始します... >> "%LOG_FILE%" 16 17REM エラーフラグを設定 18set ERROR_FOUND=0 19 20REM エラーリストファイルを初期化 21echo エラーリスト: > %LOG_DIR%\error_list.txt 22 23REM ファイルリストを読み込む 24for /f "tokens=*" %%f in (dlt_list.txt) do ( 25 if not exist %CURRENT_DIR%%%f ( 26 echo エラー: %%fは存在しません。 >> "%LOG_FILE%" 27 echo %%f >> %LOG_DIR%\error_list.txt 28 set ERROR_FOUND=1 29 ) 30) 31 32if %ERROR_FOUND%==0 ( 33 echo すべてのファイルパスが正しいことを確認しました。 >> "%LOG_FILE%" 34) 35 36if %ERROR_FOUND%==1 ( 37 type %LOG_DIR%\error_list.txt 38 echo エラーが見つかりました。処理を続行しますか? (y/n) 39 set /p CONTINUE= 40 if /i "%CONTINUE%"=="n" ( 41 echo 処理を中止します。 >> "%LOG_FILE%" 42 goto end 43 ) 44) 45 46echo SVNリポジトリからファイルを削除します... >> "%LOG_FILE%" 47 48REM ファイルリストを再度読み込む 49for /f "tokens=*" %%f in (dlt_list.txt) do ( 50 if exist %CURRENT_DIR%%%f ( 51 echo %%fを削除しています... >> "%LOG_FILE%" 52 %SVN_PATH% /command:remove /path:"%CURRENT_DIR%%%f" /notempfile /closeonend:1 53 if errorlevel 1 ( 54 echo 削除中にエラーが発生しました。処理を中止します。 >> "%LOG_FILE%" 55 goto end 56 ) 57 ) 58) 59 60echo 削除が完了しました。 >> "%LOG_FILE%" 61goto final 62 63:end 64echo 処理が中止されました。 >> "%LOG_FILE%" 65 66:final 67pause

■発生事象
ファイルパスが合っている(%ERROR_FOUND%=0)がカーソルが点滅して入力待ちの状態になってしまう。

ただ、エラー時のように「エラーが見つかりました。処理を実行しますか?(y/n)」というメッセージの表示は出ない。

カーソル点滅時にyやエンターを押すとコマンドプロンプトが閉じる。(svnの削除コマンドは実行される)
カーソル点滅時にnを押すとコマンドプロンプトが閉じる。(svnの削除コマンドは実行されない)

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

■試したこと
1)%ERROR_FOUND%=0のメッセージ表示後に「goto dltsvn」を追加して強制的に削除の処理へ進める。(svn削除の処理の部分に「:dltsvn」を追加)

testbatch.bat

1 2途中は同じなので省略 3 4if %ERROR_FOUND%==0 ( 5 echo すべてのファイルパスが正しいことを確認しました。 >> "%LOG_FILE%" 6 goto dltsvn   ←これを追加して飛ばしてる 7) 8 9if %ERROR_FOUND%==1 ( 10 type %LOG_DIR%\error_list.txt 11 echo エラーが見つかりました。処理を続行しますか? (y/n) 12 set /p CONTINUE= 13 if /i "%CONTINUE%"=="n" ( 14 echo 処理を中止します。 >> "%LOG_FILE%" 15 goto end 16 ) 17) 18 19:dltsvn  ←ファイルパス確認して正常ならここに飛ばす 20echo SVNリポジトリからファイルを削除します... >> "%LOG_FILE%" 21 22REM ファイルリストを再度読み込む 23for /f "tokens=*" %%f in (dlt_list.txt) do ( 24 if exist %CURRENT_DIR%%%f ( 25 echo %%fを削除しています... >> "%LOG_FILE%" 26 %SVN_PATH% /command:remove /path:"%CURRENT_DIR%%%f" /notempfile /closeonend:1 27 if errorlevel 1 ( 28 echo 削除中にエラーが発生しました。処理を中止します。 >> "%LOG_FILE%" 29 goto end 30 ) 31 ) 32) 33 34echo 削除が完了しました。 >> "%LOG_FILE%" 35goto final 36 37:end 38echo 処理が中止されました。 >> "%LOG_FILE%" 39 40:final 41pause

2)ファイルパスのエラー発生時に続行するかの確認処理を入れずに「goto end」へ飛ばして処理を中断する。

testbatch.bat

1 2途中は同じなので省略 3 4echo ファイルパスの確認を開始します... >> "%LOG_FILE%" 5 6REM ファイルリストを読み込む 7for /f "tokens=*" %%f in (dlt_list.txt) do ( 8 if not exist %CURRENT_DIR%%%f ( 9 echo エラー: %%fは存在しません。処理を中止します。 >> "%LOG_FILE%" 10 goto end 11 ) 12) 13 14echo すべてのファイルパスが正しいことを確認しました。 >> "%LOG_FILE%" 15 16echo SVNリポジトリからファイルを削除します... >> "%LOG_FILE%" 17 18REM ファイルリストを再度読み込む 19for /f "tokens=*" %%f in (dlt_list.txt) do ( 20 echo %%fを削除しています... >> "%LOG_FILE%" 21 %SVN_PATH% /command:remove /path:"%CURRENT_DIR%%%f" /notempfile /closeonend:1 22 if errorlevel 1 ( 23 echo 削除中にエラーが発生しました。処理を中止します。 >> "%LOG_FILE%" 24 goto end 25 ) 26) 27 28echo 削除が完了しました。 >> "%LOG_FILE%" 29goto final 30 31:end 32echo 処理が中止されました。 >> "%LOG_FILE%" 33 34:final 35pause

一応動作は望むものになったのですが、根本の解決にはなってないのでどなたか原因がわかれば教えてほしいです。

2024.12.5追記

カーソル点滅時、yを入力したあとのログ
イメージ説明

カーソル点滅時、nを入力したあとのログ
イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

setoppu

2024/12/04 20:24

ログファイルにはどういう記録が残っているんですか? コマンドライン(多分バッチファイルでも)ではファイル名に半角スペース含んだりする場合は!""で全体を囲む必要がありますが、そのあたりはどうでしょう? https://qiita.com/yz2cm/items/f808e4380faa3bd51a98
Buretan

2024/12/04 20:51

回答ありがとうございます。 補足にカーソル点滅時にyまたはn入力後のログ画像を追加しました。 また、参考のリンクもありがとうございます。 こちらも試してみます。
guest

回答1

0

自己解決

エラー時のメッセージが原因でした。
(y/n)の部分が悪さをしてたようで、ダブルコーテーションで囲ったら望み通りの挙動になりました。

echo エラーが見つかりました。処理を続行しますか? ”(y/n)”

setoppuさん、参考リンクありがとうございました。
リンクの記事内容を見てこの閃きに繋がりました。

投稿2024/12/04 21:30

編集2024/12/04 21:31
Buretan

総合スコア33

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2024/12/05 15:56

1文しか書けないところに複数の文を書くために、複数の文を「(」と「)」 で囲んだ場合には、 「(」の次に、クォートされていない「)」が出てきたらそれが閉じ括弧と見做されます。 echo だけじゃなくて、set X=(ABC) のようなケースでも同様ですね。 「)」をクォートする場合、引用符で囲んでも良いのですが、それだと引用符も対象文字列に含まれてしまうので、 それを避けたい場合は、普通は「直後の1文字だけのクォート」を行う「^」という記号を使います。 多くの言語での「\」と同じような意味でで、「構文上の閉じ括弧」を、単なる「)」という文字に変えます。 echo エラーが見つかりました。処理を続行しますか? (y/n^)
Buretan

2024/12/05 21:07

otnさん そういう決まりがあったんですね。 補足ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問