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

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

新規登録して質問してみよう
ただいま回答率
85.48%
コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

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

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

Q&A

解決済

3回答

362閲覧

バッチファイルの間違いを教えて下さい

ZZ-TOP

総合スコア36

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

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

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

0グッド

0クリップ

投稿2018/03/26 16:27

編集2018/03/27 03:18

前回
画像の長辺を900pxにしたい

で簡単な、バッチファイルの扱い方を教えて頂きました。
ありがとうございます。

おかげさまで、とりあえず、基本的なバッチファイルを扱えるようにはなりました。

ですが、確認したところ、もとのソースコードが間違えているらしく、
縦横の判断が出来ず機能しません。

本当なら以下のコードで画像の縦横の長さを確認して、
長編を900pxにするバッチファイルです。

※ImageMagickが必要ですが

エラーはなく動作するのですが、縦横の判断が出来ず、
縦長の画像でも幅を900pxにしてしまいます。

「GEQ」を「LSS 」にすると、今度は縦をすべて900pxにするので、
条件式より、変数の扱いがおかしいような気がします。

ですがソースを見ても自分では特におかしいようには思いません。

すいませんが、バッチファイルに詳しい方、間違えているところを教えて下さい。

元のソースコードはこちらです。
長辺900pxにリサイズするbatファイル

↑ こちらソースの動作も同様です。
そのため、自分なりにおかしいと思うところを修正しています。
※修正しても症状は同じなのですが。
※扱う画像は「.jpg」にしています。

すいませんが、バッチファイルの扱いに詳しい方、よろしくお願いします。

追記
ご解答を頂いてもすぐに応対出来ないかもしれないです。
※翌日以降の返答になるかもしれません。

すいませんが、よろしくお願いします。

for %%f in (*.jpg) do ( REM 画像の縦を取得 for /f "usebackq tokens=*" %%i in (`identify -format '%%w %%h'`) do @set HEIGHT=%%h REM 画像の幅を取得 for /f "usebackq tokens=*" %%j in (`identify -format '%%w %%h'`) do @set WIDTH=%%w if !HEIGHT! GEQ !WIDTH! ( REM 縦 >= 横幅 convert -resize x900 %%f %%~nf_resized.jpg ) else ( REM 縦 < 横幅 convert -resize 900x %%f %%~nf_resized.jpg ) )
for %%f in (*.png) do ( REM 画像の縦幅を取得 for /f "usebackq tokens=*" %%i in (`identify -format '%%h' %%f`) do @set HEIGHT=%%i REM 画像の横幅を取得 for /f "usebackq tokens=*" %%i in (`identify -format '%%w' %%f`) do @set WIDTH=%%i REM アドバイスにより追加 set HEIGHT=!HEIGHT:'=! set WIDTH=!WIDTH:'=! if !HEIGHT! GEQ !WIDTH! ( REM 縦幅 >= 横幅 convert -resize x900 %%f %%~nf_resized.png ) else ( REM 縦幅 < 横幅 convert -resize 900x %%f %%~nf_resized.png ) )
for %%f in (*.png) do ( REM 画像の縦幅を取得 for /f "usebackq tokens=*" %%i in (`identify -format "%%h" %%f`) do @set HEIGHT=%%i REM 画像の横幅を取得 for /f "usebackq tokens=*" %%i in (`identify -format "%%w" %%f`) do @set WIDTH=%%i if !HEIGHT! GEQ !WIDTH! ( REM 縦幅 >= 横幅 convert -resize x900 %%f %%~nf_resized.png ) else ( REM 縦幅 < 横幅 convert -resize 900x %%f %%~nf_resized.png ) )
setlocal enabledelayedexpansion REM ↑このコマンドは必要! for %%f in (*.png) do ( REM 画像の縦幅を取得 REM "%%h"でくくる、「'」でくくると文字扱いになる=条件式が機能しない for /f "usebackq tokens=*" %%i in (`identify -format "%%h" %%f`) do @set HEIGHT=%%i REM 画像の横幅を取得 for /f "usebackq tokens=*" %%i in (`identify -format "%%w" %%f`) do @set WIDTH=%%i if !HEIGHT! GEQ !WIDTH! ( REM 縦幅 >= 横幅 convert -resize x900 %%f %%~nf_resized.png ) else ( REM 縦幅 < 横幅 convert -resize 900x %%f %%~nf_resized.png ) )

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

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

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

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

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

guest

回答3

0

ベストアンサー

ですが、確認したところ、もとのソースコードが間違えているらしく、
縦横の判断が出来ず機能しません。

確かに元のバッチファイルでは期待通りの結果は得られませんね。ただし、よく判らないままいじっても事態を悪化させるだけです。

元のバッチファイルは一見動作するように見えますが、identifyコマンドの出力結果の扱いに不備があるため、大小比較がうまくできていません。
identifyコマンドは、'1280'のように数値をシングルコーテーションでくくって出力しています。それをそのまま比較しようとすると文字列の大小比較になってしまい、例えば'1280''720'では、'720'の方が大きいとみなされることになります。期待通りに動かないのはそのためです。

ということで、数値として大小比較ができるようにidentifyコマンドの出力からシングルコーテーションを外す必要があります。
元のバッチファイル(に拡張子だけ書き換えたもの)のif !HEIGHT! GEQ !WIDTH! (の手前に、以下の2行を書き加えてください。

dos.bat

1set HEIGHT=!HEIGHT:'=! 2set WIDTH=!WIDTH:'=!

よく考えたら、最初からidentifyコマンドの出力にシングルコーテーションが付かないようにすればいいわけですよね(何か意図があると思って見過ごしていましたが)。
上の2行を追加するよりは、identifyコマンドの'%%h'および'%%w'のシングルコーテーション(')をダブルコーテーション(")に書き換える方が良さそうです。

投稿2018/03/27 01:46

編集2018/03/27 02:04
catsforepaw

総合スコア5938

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

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

ZZ-TOP

2018/03/27 02:10

ご解答ありがとうございます。 アドバイスとおり、2行を追加してみたのですが、 動作に変化はありません。 元の質問に2個目のコードを貼り付けてあります。 私の解釈では、これでアドバイス通りだと思います。 こちらの解釈が間違えているのだと思いますが、 他に思いあたる変更がわかりません。 お気づきの点があれば、 勘違いしているところをご指摘、頂けたらうれしいです。 すいませんが、よろしくお願いします。 今回はご解答ありがとうございます。
catsforepaw

2018/03/27 02:12

貼り付けたコードはそれがすべてでしょうか? `setlocal enabledelayedexpansion`が抜けていますが、それがないと正しく動きませんよ。
ZZ-TOP

2018/03/27 02:36

ご解答ありがとうございます。 アドバイス通り `setlocal enabledelayedexpansion` を追記したら正常に動作しました。 何度もアドバイスして頂き、ありがとうございます。 お手数でなければ、1つ教えて下さい。 `setlocal enabledelayedexpansion` はどういう意味で、どんな時に必要なコマンドなのでしょうか? 不思議に思う理由は以下のとおりです。 1) バッチファイルの基本的な動作を説明しているページに記載がなかった。 ※私が参考にしているページに全く記載がありませんでした。 2) 最初に元のコードを実行した時に `setlocal enabledelayedexpansion` があったら動作しなかった。 ※削除したら動作しました。 ↑ バッチファイルを扱う初めての経験だったので、 このコマンドとは別に初歩的な操作ミスがあったのかもしれませんが。 ご面倒でしたら、スルーでOKです。 今回はご解答ありがとうございます。 機会がありましたら、またお願い致します。 追記 後程、みなさんにコメントして、最後にまとめてベストアンサーをつけます。 まとめるまでしばらくお待ちください。
catsforepaw

2018/03/27 02:52

`setlocal enabledelayedexpansion`は「遅延環境変数」を有効にするためのものです。環境変数の展開で`%`の代わりに`!`が使えるようになります。「遅延環境変数」については説明すると長くなるので、検索してみてください。いろいろ出てきます。 ちなみに、コマンドプロンプトで`setlocal /?`を実行するとコマンドの説明が表示されるので、まずはそれを見てみると良いでしょう。それ以外のコマンドも、例えば`for /?`のように`/?`で説明が表示されるようになっています。
ZZ-TOP

2018/03/27 03:03

何度も教えて頂きありがとうございます。 アドバイスを参考に調べてみます。ヒントを教えて頂きありがとうございます。 「`setlocal /?`を実行するとコマンドの説明が表示されるので、まずはそれを見てみると良いでしょう」 ありがとうございます、とりあえずこれから取り組みます。 何回もアドバイスして頂きありがとうございます。機会がありましたらまらお願いします。 後程まとめてベストアンサーとさせて頂きます。 今回は解答して頂きありがとうございます。機会がありましたら、またお願いします。
ZZ-TOP

2018/03/27 03:23

質問の最後に教えて頂いた正常動作するコードを追加しました。 ※コード作成上の注意点、etc.、簡単に追加しました。 解答して下さったみなさん。ご解答ありがとうございました。 ``` REM コメントにコードを記載するテスト   test ```
guest

0

ここがおかしいです。

REM 画像の縦を取得 for /f "usebackq tokens=*" %%i in (`identify -format '%%w %%h'`) do @set HEIGHT=%%h REM 画像の幅を取得 for /f "usebackq tokens=*" %%j in (`identify -format '%%w %%h'`) do @set WIDTH=%%w

同じことをやっているので、HEIGHTにもWIDTHにもおなじもの("幅 高さ")が入ります。必ず同じものを比べることになるのだから、次のifでの比較が実質的に機能しないのは当然です。

HEIGHTを取得する行では%%wを抜き、WIDTHを取得する行では%%hを抜きましょう。

投稿2018/03/26 17:44

KojiDoi

総合スコア13671

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

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

ZZ-TOP

2018/03/27 02:50

ご解答して頂き、ありがとうございます。 別の方のアドバイスで、解決しましたが、 機会がありましたら、またお願いします。 今回は解答して頂きありがとうございます。 機会がありましたら、またお願い致します。
guest

0

元のソースコードはこちらです。

は、正しそうに見えます。

質問中のコードは、全然駄目です。
元のソースコードをそのまま使えば良いのでは?

投稿2018/03/26 17:18

otn

総合スコア84529

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

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

ZZ-TOP

2018/03/27 01:44

ご解答ありがとうございます。 元のソースコードでやってみましたがダメです。 前述のとおり全部の画像の幅を900pxにしてしまい、 縦長の画像でも900×1200pxなどになります。 ※コードはそのままでpng画像を用意しました。 何かお気づきの点があれば、またお願いします。 今回は、ご解答ありがとうございます。
otn

2018/03/27 06:31

私はidentifyの仕様を知らずに回答してしまいましたが、identifyを使っている人がidentifyの使い方で間違うとは思いませんでしたので、「バッチスクリプトとしては正しい」ということで、「正しい」と回答しました。 失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問