なぜか簡単なコマンドが無限ループになる
※今回はxcopyで発生しましたが、他のコマンドでも起きる事象です。
よし!初級者プログラマー脱出の一環として
生産性を上げるために、バックアップバッチを作ろう!
xcopyをつかってフォルダごとバックアップだ!
その前にxcopyの練習をしよう!
まずはxcopy.txtという
テキストファイルを作成して以下のように記載
xcopy /Y /E C:\moto D:\saki
pause
で、拡張子を『xcopy.bat』に変えて実行!
ん?
うぉぉぉぉぉ!
止まらなない!
pauseコマンドあるのに止まらない。
コマンドプロンプトから直接入力すればできるぞ。
・・・一体なぜ?
結論
結論からいいますと
自分(xcopy)で自分(xcopy.bat)を呼んでいました。
つまり
バッチファイル名をxcopy.batとしていたのが良くなかったです。
コマンドプロンプトの仕様として・・・
そもそもコマンドプロンプトの仕様として
ABC.batというバッチファイルを作ると
バッチファイルで
ABCという記述があれば同じフォルダにある『ABC.bat』
を呼び出す仕様なのです。
この場合、
xcopy.batというファイル名で
xcopy /Y /E C:\moto D:\saki
の記述があるので
自分自身を呼び出し、また自分自身を呼び出し・・・・
という繰り返しになっており、
1行目でずっと永久ループになっているので、
当然pauseまでいかないのです。
ファイル名を変更して解決
そのため
xcopy.batではなく
xcopy_test.batと名前を変えたら動くようになりました。
なので、XCOPYに限らずコマンド名をそのままファイル名にするのはやめましょう!
(自分に言い聞かせる。。。)
中級者への鍵
プログラマーとして、
ファイル名や、ソースコードには本来の使用用途以外では予約語を使わない
という掟があります。
予約語とは今回の例でいうと
- XCOPY
- pasue
のように
あらかじめ、その言語、スクリプトで決まっているコマンド名やシステム変数などです。
これらを本来の意味以外で使ってしまうと、今回のように思わぬことが起きてしまいます。
ほとんどのプログラム言語ではソースコードに予約語を使うと構文エラーとなるので気づけると思います。
スクリプトは構文チェックしてくれないので十分に気をつけた方がよいと思います。
ファイル名を予約語にしてしまうなんて、、不覚。。。
ファイル名には予約語を使わない