2024年5月12日

@for /l %%i in (1,1,3) do @for /l %%j in (2,2,6) do ( set /a ans=%%i*%%j echo ansは%ans% )
の結果が
ansは ansは ansは ansは ansは ansは ansは ansは ansは
になるなんて知らなかった・・・コマンドプロンプトでは%で囲まれた変数は途中経過を無視して一気に展開されるものだかららしい。



正しく処理させるためには、バッチファイルを作って先頭に setlocal enabledelayedexpansion という記述を付加し、そして使用する環境変数はビックリマークで囲む。
setlocal enabledelayedexpansion for /l %%i in (1,1,3) do ( for /l %%j in (2,2,6) do ( set /a ans=%%i*%%j echo ansは!ans! ) ) endlocal
これで予想通りの結果で出力される。
ansは2 ansは4 ansは6 ansは4 ansは8 ansは12 ansは6 ansは12 ansは18



参考にしたウェブサイト
https://wa3.i-3-i.info/word12518.html





その後、早速使うことになったのだが、デメリットって無いのか?と思って検索したところ解説していた。
https://qiita.com/yz2cm/items/4983be006116c369d08b

どうも、ファイル名にワイルドカードを使用したりする場合には非常に注意が必要みたい。

何故なら、ビックリマークを2つ以上使用しているファイル名が存在する場合、それだけで誤動作を引き起こしてしまうから。

たとえば
stanch!それは永遠の輝き!.txt
という名前のファイル名が存在する場合、ワイルドカードを使用してこのファイルを選択すると予期せぬ動作を引き起こす。

ビックリマークがファイル名として使えるのでこういう問題が起きる。

だからバッチファイル全体をsetlocal enabledelayedexpansionで囲むのは危険みたいだ。

!〜〜!を使用する要所要所でだけ囲んでいけばいいみたい。



多分こういうファイル名でも駄目だろうね
俺様はstanchだ!!!!!.txt
業務系ファイルではビックリマークをファイル名に付与したりはしないだろうけど、学生時代のノリで作ったファイルとかだと引っかかりそう。
自分もこんなファイル名のやつあった気がする・・・

自分自身で使う場合はともかく、ネット上で配布プログラムの一部として添付したり仕事でプログラムに添付したりする場合には特に気を付ける必要がありそう。

コメント一覧

下に行くほど新しいコメントです

この記事にコメントを投稿した人はまだいません

コメントをどうぞ

名前: