バッチファイルで2行以上のコマンドが、1行目しか実行されない問題の対応
どうも、かげさんです(^^)/
あなたがこの記事を読んでいるのは何回目でしょうか?
初めての方、いらっしゃい!
複数回目の方、再訪問ありがとです(・∀・)
前の記事「画像ファイルをコマンドラインからリサイズできるImageMagick(イメージマジック)を導入してみた」でImageMagickを導入してみました。
前の記事の最後に、こんなことを書きました。
コマンドラインでできるってことは、バッチファイルでもできるってことなので指定した複数ファイルも同じように行けそうだ。
自作ツールに縮小したいファイルをドラッグ&ドロップしてファイルリストを作り、自動計算したサイズで縮小するコマンドをバッチファイルとして出力してバッチファイルを自動実行すれば、目的のものは作れそうだな。
実際にプログラムを書いてみて、ちょっと想定していなかった問題「バッチファイルで2行以上のコマンドが、1行目しか実行されない」が起きたので、今回はその原因と対処について書いてみます。
作った画面
作った画面はこんな感じ。
開発言語は、Visual C# (Microsoft Visual Studio Community 2019)です。
画面中央にある上下左右のスクロールバーがあるリストボックスから下の部分を追加しました。
このリストボックスは、ドラッグ&ドロップで処理対象ファイルを受け付けられるように AllowDrop プロパティを true にしています。
DragEnter イベントで対象拡張子は、.JPG と .PNG に絞り込みました。
DragDrop イベントでは、受け付けたファイルをリストボックスに追加しています。
ここまでは、特に問題なかったのですが、バッチファイルを出力して実行してみたところで問題が起きました。
作成したバッチファイルで起きたトラブル
出来上がったバッチファイルで2行以上コマンドが、1行目しか実行されないという問題です。
具体的にはバッチファイルが下記のようになっていたとします。
magick 変更前ファイル名1 - resize 216x504 変更後ファイル名1
magick 変更前ファイル名2 - resize 216x504 変更後ファイル名2
magick 変更前ファイル名3 - resize 216x504 変更後ファイル名3
pause
この時に、変更前ファイル1は処理されるのに、変更前ファイル2の処理が行われずに終わってしまいました・・・(´・ω・`)
大きく原因は2つありました。
- 改行コードを間違えてバッチファイルを出力した(CRLF にしないといけないところを LF にしていた)
Windows だから、改行コードは CRLF = \r\n にしないとイケないところが
LF = \n にしていた。
気付けば、単純ミスなんですが、結構ハマりました。
ハマる要素は2つありました。
- 最初「start コマンド」形式で書いていなかったからかな?と思ったこと。
Windows 10 や 11 で1行目しか実行されないときの対処でよくあるのが「start コマンド」形式にすることです。
ところが「start コマンド」形式で書くと次の行が実行されるようになったものの、magickコマンドとして期待した感じでは解釈されず、変なところで引数が区切られるという事象が起こり、コマンド実行エラーが出まくり、あれれ?となった…(;^_^A - バッチファイルの確認をメモ帳で確認していた。
これも改行コードの間違いに気づけなかった要因でした。
普段通り EmEditor で開けば、改行コードの違いが可視化されるため、原因がすぐに分かったのに…(;^_^A
- 最初「start コマンド」形式で書いていなかったからかな?と思ったこと。
- ImageMagick の magick コマンドを実行すると文字コードが変わってしまう
前述の改行コードの間違いに気づいた後は、2行目以降も実行されるようになったものの、今度は2行目以降が文字化けするようになった。
どうやら magick コマンドを実行すると文字コードが変わってしまうようで、magick コマンド実行前に chcp コマンドで文字コードを毎回指定してやらないと文字コードが変わってしまい、日本語のフォルダ名やファイル名が文字化けして期待通り動かないことが判明。
思ったより気付くのに時間がかかってしまった。
『chcp』コマンドで指定する代表的な文字コード
コードページ番号 | 文字コード |
65001 | UTF-8 |
932 | Shift-JIS |
※Microsoft 公式ドキュメント:他のコードページ番号と文字コードの対応表
https://learn.microsoft.com/ja-jp/windows/win32/intl/code-page-identifiers
最終的なバッチファイル
最終的にバッチファイルとしては、▼こんな感じになりました。
chcp 932
magick 変更前ファイル名1 - resize 216x504 変更後ファイル名1
chcp 932
magick 変更前ファイル名2 - resize 216x504 変更後ファイル名2
chcp 932
magick 変更前ファイル名3 - resize 216x504 変更後ファイル名3
pause
バッチファイルを生成する C# プログラムは、後日載せます。
ここまではOKだ
コメント
このブログの新着コメントをRSSリーダに登録する為のxml