====== コマンドプロンプトのいろいろ ======
windowsのCUI環境コマンドプロンプトにおける、Tipsなど
===== コードページ切り替え =====
コマンドプロンプト上でのコードページは、windows標準であるMS932((Shift_JISのMicrosoftの独自拡張エンコード))になっている。\\
これがなんらかの原因で書き換わってしまった場合や、MS932以外のコードページでコマンドプロンプトを使用したい場合、CHCPコマンドを使用する。\\
> CHCP {使用したいコードページ番号}
以上でコードページの変更が可能。\\
UTF-8に変更したい場合であれば、
> CHCP 65001
逆にコードページをMS932に戻したい場合は、
> CHCP 932
でOK。\\
ただし、下のコードページ一覧に記述があるものの、指定しても使用できないコードページもあるようです。
==== コードページ一覧 ====
[[ja:other:codepagelist|コードページ一覧]]
===== 手軽にSleep処理を行う =====
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オプションに指定すると良い。
==== もっと手軽にSleep処理を行う ====
なんと**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オプションについて ====
FOR文は/Fオプションでは、オプションの引数を指定することで、様々な処理が可能になる。\\
テキストファイルをカンマ区切りで分割し、任意の列の文字列だけをECHOするとか。((**/F**オプションマジ便利!でも書くの面倒だから各々検索してくれ!頼む!(ぉぃ))
=== 複数の空白文字を含む場合の取り扱い ===
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**オプションが指定されていない場合、デフォルトの区切り文字は空白文字となるが、引き渡される文字列中に空白文字が連続して入っていたり、行頭に入っていたりする場合、次のように取り扱われる。
* 連続する空白文字は1文字として扱われる。\\ (空白文字毎に別の部分文字列に分解されない)
* 行頭の空白文字は無視される。\\ (行頭の空白文字の後に来る最初の部分文字列が1つ目の文字列として取り扱われる)
===== 任意のテキストファイルを一行ずつ読み込んで処理する =====
任意のテキストファイルを一行ずつ読み込んで処理した場合は次のようにする。
for /f "delims=" %%A in ( [任意のファイル名] ) do call :sub %%A
:sub
echo %1
一行ずつ読み込んで、サブルーチンに引数として渡す感じですね。
**delims=**の部分を**eol=# delims=**とかにするとシャープ記号をコメント扱いにもできます。
===== 末尾が数値の文字列をECHOでリダイレクトする =====
リダイレクト、といえば>や>>などでテキストをファイルに出力するのによく使いますが、次のようになっていると、うまく出力されません。
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)\\