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

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

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

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

バッチファイル

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

Q&A

解決済

1回答

1040閲覧

バッチファイルで現在の進捗を百分率で表示するにはどうすればよいのか。

ypp

総合スコア66

コマンドプロンプト

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

バッチファイル

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

0グッド

1クリップ

投稿2023/02/02 20:58

編集2023/02/03 22:21

バッチファイルを今日学び始めた者です。
C:/Users/user/Downloads/直下のすべてのファイルを取得し、一つづつ表示する際に、進捗を付け加えたいと思っているのですが、うまくいきません。
以下が試したことです。

batch

1@echo off 2chcp 65001 3cls 4setlocal enabledelayedexpansion 5set default=C:\Users\user\Downloads\ 6cd !default! 7dir /a:-d /b *.*>files.txt 8set filecount=0 9for /f %%a in (!default!files.txt) do ( 10 set /a filecount+=1 11) 12echo "!filecount!個のファイルが見つかりました。" 13echo "ファイルを表示します。" 14set count=1 15for /f "delims=" %%a in (!default!files.txt) do ( 16 set /a percent=!count! / !filecount! * 100 17 echo "!count!/!filecount! (!percent!%%): %%a" 18 set /a count+=1 19) 20del !default!files.txt 21pause

自分が考えていることです。
2行目: chcp 65001 - 文字コードをUTF-8に設定。
4行目: setlocal enabledelayedexpansion - よく分からないが、これを宣言しないと、変数を宣言した後、変数を使おうと思っても使えないことがある。
5行目: set default=C:\Users\user\Downloads\ - 頻繁にコードで使用するため変数に格納。
6行目: cd !default! - Downloadsディレクトリに移動。
7行目: dir /a:-d /b *.*>files.txt - Downloadsディレクトリ直下のすべてのファイルの名前を一時的にfiles.txtに保存する。/a:-dはファイルのみ取得、/bはファイル名のみ取得。
8-11行目: for /f %%a in (!default!files.txt) do () - files.txtの行数をカウント。これでファイル数がわかる。files.txtを一行ずつ読み込み、それに伴いfilecountを1づつ増やす。/fはおそらくファイル読み込み。
15行目: for /f "delims=" %%a in (!default!files.txt) do () - files.txtを一行ずつ読み込む。"delims="は区切り文字をなくすためのもの。
16行目: set /a percent=!count! / !filecount! * 100 - 現在のインデックスからファイル数を割り、100を掛けた進捗。原因はおそらくここ
17行目: echo "!count!/!filecount! (!percent!%%): %%a" - "インデックス/ファイル数 (進捗%): ファイル名"を表示する。
20行目: del !default!files.txt - files.txtを削除。


出力

text

1"10個のファイルが見つかりました。" 2"ファイルを表示します。" 3"1/10 (0%): test1.txt" 4"2/10 (0%): test2.txt" 5"3/10 (0%): test3.txt" 6"4/10 (0%): test4.txt" 7"5/10 (0%): test5.txt" 8"6/10 (0%): test6.txt" 9"7/10 (0%): test7.txt" 10"8/10 (0%): test8.txt" 11"9/10 (0%): test9.txt" 12"10/10 (100%): test10.txt"

このように、進捗をうまく表示できません。考えられることとしては、計算式が間違っているか、setコマンドで割り算をすると少数が切り捨てられるのでうまく計算できないのどちらかです。
こちらを以下のようにするにはコードをどのように変えればよろしいのでしょうか?

text

1"10個のファイルが見つかりました。" 2"ファイルを表示します。" 3"1/10 (10%): test1.txt" 4"2/10 (20%): test2.txt" 5"3/10 (30%): test3.txt" 6"4/10 (40%): test4.txt" 7"5/10 (50%): test5.txt" 8"6/10 (60%): test6.txt" 9"7/10 (70%): test7.txt" 10"8/10 (80%): test8.txt" 11"9/10 (90%): test9.txt" 12"10/10 (100%): test10.txt"

また、echo "ファイルを表示します。"の二重引用符を外すと

txt

1'�示します。' is not recognized as an internal or external command, 2operable program or batch file.

と表示されるのですがこれを治す方法はありませんか?できれば二重引用符を外して出力したいです。

また、この他に修正したほうがいいところがある場合はご指摘ください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

set /a percent=!count! / !filecount! * 100

計算は左から順番に行いますので、例えば10ファイル中の1ファイル目であれば、 1 / 10 * 100ですが、1 / 10 は 0 なので、それに100を掛けても 0 です。先に 100 を掛ける必要があります。
set /a percent=count*100/filecount
これだと、1 * 100 は 100 でそれを 10 で割るので 10 になります。

echo "ファイルを表示します。"の二重引用符を外すと

二重引用符だけじゃなくてechoまで削除しちゃったのでは?

投稿2023/02/02 21:36

otn

総合スコア84423

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

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

ypp

2023/02/03 07:40 編集

ありがとうございます。先に100を掛けたところ、期待通りに動作しました。 > 二重引用符だけじゃなくてechoまで削除しちゃったのでは? これについて原因を調査しましたところ、 echo "!filecount!個のファイルが見つかりました。" echo "ファイルを表示します。" のどちらも二重引用符を外すとエラーが見られるようです。 https://imgur.com/a/HbIAbis
ypp

2023/02/03 09:11 編集

補足です。 以下のコードだけで再現できました。 @echo off chcp 65001 echo テスト1 echo テスト2 cmd /k 私の推測ですが、日本語はマルチバイトなので、その影響で「1」の2番目のバイトが改行文字と合体したのだと思います。
ypp

2023/02/03 09:10

ちなみにですが 「テスト1」「テスト2」の横に半角スペースを置くことで、この症状は治りました。
otn

2023/02/03 13:21

なるほど。2行に渡っての場合ですね。同様のバグをこのサイトで見た記憶が呼び覚まされました。 「CMD 日本語 バグ」で検索してもなかなか出てこないですね。 特定の条件で次の行の先頭数バイトが欠けるという現象。前の行はechoじゃなくても同じ。 (なので、次の行頭に空白でも何でも文字を何個か入れると大丈夫) CMD.EXEはマルチバイト文字関連のバグはちょいちょい出くわします。大体がこれみたいに長さ計算をミスってるっぽいもの。 Windows2000のバグはXPで直って、XPのバグは7で直ってたりしたのですが、これはどうかな。 日本語使う場合、普通はSJISなのでなかかな出くわさないですが、日本語以外のUTF8文字でもおそらく出るんでしょうね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問