わすれなぐさ

自称情報ブログ・備忘録

カテゴリ: PC

バッチファイルのif文の中で変数をsetし、同じif文の中でその変数を使うと期待通り動きません。

原因

if文が実行された時点で、if文の中身がすべて読み込まれるためです。

実例

次のようなバッチファイルを作成します。
if 1 == 1 (
    set a="foo"
    echo %a%
    pause
)
echo %a%
pause
これを実行すると、次のように画面に表示されます。
C:\>if 1 == 1 (
set a="foo"
 echo
 pause
)
ECHO は <ON> です。
続行するには何かキーを押してください . . .

C:\>echo "foo"
"foo"

C:\>pause
続行するには何かキーを押してください . . .
これを見ると、if文がまとめて読み込まれており、同じif文内のechoは%a%に何も入っていない状態で実行されていることがわかります。

ただし、次のecho %a%が期待通り実行されていることから、if文を抜けた後は変数に値が入るようです。

補足

for文内や、set /a、set /pでも同様の問題が起こります。

対策

gotoをうまく使うなどの工夫をするか、遅延環境変数に置き換えてみましょう。

CMD.EXEの遅延環境変数の展開 - ふなWiki

今まで、Windowsの不要なファイルを削除するには「ディスククリーンアップ」の機能を使っていましたが、とても時間がかかることが問題でした。しかし、調べてみるとどうやら「ディスククリーンアップ」はWindows 10では非推奨らしいです。「なるほど、非推奨機能だからこんなに動作が遅かったんだな」と勝手に納得していましたが、残念ながら代替機能の「今すぐ空き領域を増やす」もかなり時間がかかるということが分かりました……

SSD機種で3GBほどの「Windows Updateのクリーンアップ」を完了するのに40分近くかかりました。

「今すぐ空き領域を増やす」が終わらないと心配しているユーザーは多いかと思いますが、実際には進んでいないわけではなく、時間がかかっているだけなので、中断せずに時間の許す限り終わるのを待ってみるのが良いと思います。

Windows 10でディスククリーンアップを実行すると「Windows Updateのクリーンアップ」で進まなくなってしまうことがよくあります。私も先程この問題に遭遇してしまったので、本当に進んでいないのか確かめてみました。

確認のため、プログレスバーの現在位置にマウスカーソルを置いてしばらく待ってみたところ、数分に1ピクセルのペースですが一応進んでいることが分かりました。結局、2時間ほどかかってクリーンアップは終了しました。私のPCはHDDですが、Windows 10をクリーンインストールしてすぐにクリーンアップを実行したため、おそらく、これでも比較的早く終わったほうだと思います。使い込まれた環境では、これよりずっと長くかかるかもしれません。

「こんなに遅いなんておかしいだろ!」と思ったかもしれませんが、実は、Windows 10では「ディスククリーンアップ」が非推奨の機能になっているようです。代替機能は「設定→システム→ストレージ→今すぐ空き領域を増やす」から実行可能なので、今後はこちらを使うようにしてみると、多少は早く終わるようになるかもしれません。

参考:

備忘録。

1. MPC-BE
MPC-HCをベースに開発された高機能で軽量なメディアプレイヤー。

2. MPC-HC
11年間開発が続けられた軽量でシンプルなメディアプレイヤー。2017年で開発が終了した。

3. VLC Media Player
おそらく一番ダウンロードされている人気のメディアプレイヤー。万能と言えるほど高機能なので、これさえ入れておけば間違いない。ただし少し重い。

4. SMPlayer
最軽量?

参考:

Windows向けOneNote(2016じゃないほう)で、英語の先頭文字を大文字にしない方法です。

設定方法

① 右上の「…」を押して「設定」をクリックします。

② 「オプション」をクリックします。

③ 下の方に「オートコレクト」の設定があるので「オフ」に切り替えます。
onenote capitalize setting
④ OneNoteを閉じてからもう一度起動すると、先頭の文字が勝手に大文字に修正されなくなっています。

このページのトップヘ