windowsのCUI環境コマンドプロンプトにおける、Tipsなど
コマンドプロンプト上でのコードページは、windows標準であるMS9321)になっている。
これがなんらかの原因で書き換わってしまった場合や、MS932以外のコードページでコマンドプロンプトを使用したい場合、CHCPコマンドを使用する。
> CHCP {使用したいコードページ番号}
以上でコードページの変更が可能。
UTF-8に変更したい場合であれば、
> CHCP 65001
逆にコードページをMS932に戻したい場合は、
> CHCP 932
でOK。
ただし、下のコードページ一覧に記述があるものの、指定しても使用できないコードページもあるようです。
WindowsのバッチファイルでSleep処理を行う場合、sleepやwaitといったコマンドが準備されていない為、vbsやその他のプログラムを準備するなどする必要があるが、秒単位で、かつアバウトで良いのであれば、pingコマンドを使って簡単にSleep処理を実行できる。
sleep.bat
@ECHO OFF ECHO "処理A" REM ここで10秒Sleepしてみる PING -n 10 localhost > NUL ECHO "処理B"
やっている事は至極簡単で、pingコマンドが1回辺り約1秒毎で実施される事を利用し、-nオプションでその繰り返し回数を指定。
後は宛先をlocalhostで自分自身にしておけばOK。
ただし、-nで1を指定すると1秒とはならず、パケットの応答を確認すると即座に後続の処理に進んでしまう。
実際のところは希望時間+1秒を-nオプションに指定すると良い。
なんとtimeoutコマンドなる、そのものずばりなコマンドがあった。
書式は
timeout /T 秒数 [/NOBREAK]
画面表示もカウントダウンしてくれるので、非常に良い。
無言で待機させたい場合はNULLへリダイレクトすればよい。
TIMEOUT /T 10 /NOBREAK > NUL
Linuxのシェルスクリプトの場合、コマンドの実行結果を変数に代入するのはサクッと簡単にできるが、Windowsバッチの場合は直感的にはできない。一手間かけてfor文を使う。
var.bat
@ECHO OFF REM hostnameコマンドの実行結果を変数DATAに代入する SET DATA= FOR /f %%A in ('hostname') do SET DATA=%%A ECHO %DATA%
FOR文中の「~~~」の部分に実行したいコマンドを記述すると良い。 ただし、コマンドがパイプ「|」で連結されたり、コマンドに引数を渡す為にダブルクォートやシングルクォートなどを使う場合は「^」でエスケープする必要があるので注意する。
FOR文は/Fオプションでは、オプションの引数を指定することで、様々な処理が可能になる。
テキストファイルをカンマ区切りで分割し、任意の列の文字列だけをECHOするとか。2)
FOR /F "tokens=2" %%A IN ( hogehoge.txt ) do echo %%A
上記のような処理で、hogehoge.txtを読み込んだ時、hogehoge.txtが下記のような状態だったとする。
hogehoge.txt
AAA BBB CCC DDD EEE FFF GGG
これを上のコマンドで処理すると、出力は以下の様になる。
FOR /F "tokens=2" %%A IN ( hogehoge.txt ) do echo %%A BBB EEE GGG
delimsオプションが指定されていない場合、デフォルトの区切り文字は空白文字となるが、引き渡される文字列中に空白文字が連続して入っていたり、行頭に入っていたりする場合、次のように取り扱われる。
任意のテキストファイルを一行ずつ読み込んで処理した場合は次のようにする。
for /f "delims=" %%A in ( [任意のファイル名] ) do call :sub %%A :sub echo %1
一行ずつ読み込んで、サブルーチンに引数として渡す感じですね。 delims=の部分をeol=# delims=とかにするとシャープ記号をコメント扱いにもできます。
リダイレクト、といえば>や»などでテキストをファイルに出力するのによく使いますが、次のようになっていると、うまく出力されません。
set AAA=hogehoge=2 echo %AAA%>fugafuga.txt
これを実際やると、末尾の2が消えます。
これを出力したい場合は、リダイレクトとecho命令の位置を差し替えて下さい。
set AAA=hogehoge=2 >fugafuga.txt echo %AAA%
バッチファイルの作成時、そのバッチファイルが存在しているフォルダのパスを取得したい時は、%~dp0と書く。
つまるところ、変数%0(実行するファイル自身のファイル名)の改変?みたいなもの。
echo %~dp0 pause
上記の内容でtest.bat等と名前をつけて、例えばC:\script\test.batとかで保存して実行すると、
C:\script\
と出力される。
スクリプトのログファイルとかのパス設定に便利。かも。
f : フルパス
d : ドライブレター+コロンのみ
p : パスのみ(ドライブレター、ファイル名を除く)
n : 拡張子を除いたファイル名のみ
x : 拡張子のみ
t : ファイルの更新日時
z : ファイルのサイズ(Byte)