2011年5月21日土曜日

CHCP = 現在の画面の言語設定(= 文字コード)を変更する - Windowsのコマンドプロンプト(bat,cmd)

Windowsコマンド。画面表示と印刷関連
○Windows XP
現在のコマンドプロンプト画面の言語設定を切り替えます。

o 変更出来る言語設定は、インストール環境によって異なります。
o Windows XPのコマンドプロンプト画面の場合、UTF-8 には完全対応していないみたいです。
o なお、次の時は、このコマンドを発行する必要はありません。
    + 外部プログラムが、直接、他の文字コードでファイルを読み書きするだけの時
        + 出力をファイルにリダイレクトする時も、大丈夫みたいです。


**** 書式
--------
chcp コードページ番号
--------

o コマンド名は、大文字小文字のどちらでも大丈夫です。
o コードページ番号 = 数字で指定します。
    + このコマンドで指定出来る、主なコードページ番号は、
        + 437 = 米国
        + 932 = 日本(= Shiht JIS のWindows仕様)
    + この他、指定出来るかもしれないコードページ番号の一覧は、機能欄をご覧下さい。


**** 戻り値 ( ERRORLEVELの値。確認分のみ )
o 0 = 成功
o 1 = エラー。指定出来ない値
    + 「無効なコードページです」 = 指定したコードページは非サポートです。
    + 「Invalid code page」 = 指定したコードページは非サポートです。


**** 使用例
--------
chcp 437
--------

    + コマンド名は、大文字小文字のどちらでも大丈夫です。


**** 機能
o 現在のコマンドプロンプト画面の言語設定を切り替えます。
    + 切り替える時には、言語に対応するコードページ番号を指定します。

o 環境によって、使用出来るコードページ番号は異なります。
o 指定出来るかもしれないコードページ番号の一覧は、「コードページ番号。その意味と一覧の在り処
o なお、次の時は、このコマンドを発行する必要はありません。
    + 外部プログラムが、直接、他の文字コードでファイルを読み書きするだけの時
        + 出力をファイルにリダイレクトする時も、大丈夫みたいです。

CHCP コマンドで指定出来る、主なコードページ番号 (= 3桁コードのみ調査)
コード意味補足説明
37IBM EBCDIC アメリカとカナダ用文字化け
437アメリカ合衆国公式サポート
500IBM EBCDIC インターナショナル文字化け
737ギリシャ文字別の言語を表示
775バルト諸国別の言語を表示
850マルチリンガル (ラテン I)公式サポート
852スラブ語 (ラテン II)公式サポート
855キリル文字 (ロシア)公式サポート
857トルコ語公式サポート
860ポルトガル語公式サポート
861アイスランド語公式サポート
863カナダのフランス語公式サポート
865北欧の言語公式サポート
866ロシア語公式サポート
869現代ギリシャ語公式サポート
874タイ語別の言語を表示
875IBM仕様の現代ギリシャ語文字化け
932日本語(= Shiht JIS のWindows仕様)日本語版の標準
    + Windows XP の32ビット版で確認しました。
    + 「公式サポート」= マイクロソフト社の公開資料「▽Chcp (Microsoft TechNet)」に明記されていた番号です。
    + 「別の言語を表示」= 別の文字コード表が割り当てれている番号です。
    + 「文字化け」= バッチファイルから呼び出すと、明らかな表示不正を起こした番号です。


**** メモ
o 次のコードページ番号は、Windows XP では上手く動きませんでした。
    + 20932 = EUC-JP = 文字化け
    + 65001 = UTF-8 = 文字化け

o Windows XPのコマンドプロンプト画面表示は、UTF-8 には完全対応していないみたいです。
    + 以前は、「chcp 65001」を指定するとエラーになっていました。
    + ところが、開発用ツールをいくつかインストールした頃から、指定出来るようになりました。
    + 但し、その状態でも表示は文字化けします。


**** 確認したバージョン
o Windows XP Service Pack 3  (+ 32ビット。Windows Update 2011年4月版)


== 関連ページ:
    ▼画面表示と印刷関連▼ABC順
    ▼Windowsコマンド一覧▼ABC順
    ▼コマンドプロンプト画面
    ▼制作メモ
    > GRAFTABL = 表示中画面の言語設定を切り替えて、グラフィックスモードを使用可能にする(= 32ビット専用)
    TITLE = 現在のコマンドプロンプト画面のタイトルを変更する
    BREAK = 何もしない。DOSシステムとの互換用
(2011年5月21日追記。外部プログラムからファイルへの直接入出力時、このコマンドは不要)

FOR /F その2 = コマンド実行結果を1行ずつ取り出して実行する方法 - Windowsのコマンドプロンプト(bat,cmd)

WindowsコマンドのFOR
○Windows XP
FOR /F で出来る事、その2です。
コマンドを実行して、その結果を1行ずつ取り出して、1行毎にコマンド実行する事が出来ます。

o このコマンドには、オプション delims と eol の既定値が設定されています。
    + 列を区切る delims オプション = 指定しないと、半角空白やタブで区切ります。
    + コメント行を示す eol オプション = 指定しないと、行の先頭が「;」(セミコロン)の時にスキップします。
o ですから、例えば1行丸ごと取り出したい時は、上記オプションを使って登場しない文字を指定します。
    + 詳しくは「FOR /F その1 = FOR文でファイルを1行ずつ取り出して実行する方法


**** 書式
--------
for /f ["オプション文字列"] %変数 in ( '実行結果を取り出したいコマンド' ) do 実行するコマンド
もしくは
for /f "usebackq [オプション文字列]" %変数名 in ( `実行結果を取り出したいコマンド` ) do 実行するコマンド
--------

o コマンド名やキーワードは、大文字小文字のどちらでも大丈夫です。
    + 但し、変数名に限り、大文字小文字を区別します。
o /f = /F オプションです。
o usebackq = 実行結果を取り出したいコマンドを「`」(= 逆引用符 = バッククォート)で括ります。
    + このオプションを付けない時は、「'」(= 一重の引用符)で括ります。
    + コマンド実行結果を取得する時は、括る文字が異なるだけで、どちらも同じ動きをするみたいです。
o オプション文字列 = 詳しくは「FOR /F その1 = FOR文でファイルを1行ずつ取り出して実行する方法
    + オプション文字列の指定が無い時の動作は、
        + 取得した行を「半角空白、もしくはタブ文字」で区切り、最初の1つを取得します。
        + 取得した行の先頭が「;」(= セミコロン)の時、コマンドを実行しません。(= データ無し扱いです。)
    + コマンド実行結果を取り出す時の、おすすめオプション文字列は
        + 「半角空白やタブ」で区切りたい時は、"eol= "
        + カンマで区切りたい時は、"eol=, delims=,"
            + eol の値を delims に合わせるのがポイントです。
        + 後は、取り出したい値の位置に合わせて、 tokens=1,2 のように指定します。
o %変数名 = 変数になる名前です。変数名は1文字で指定します。(例: %i)
    + バッチファイルでは、%%変数名。「%」を2つ書きます。
    + 変数名のおすすめは、英字1文字。こちらはヘルプに書かれています。
        + 大文字小文字を区別しますので、使う時には気を付けます。
        + (仕様外の動作)実際には、英字の他に、数字や、漢字などの全角文字も使用出来ました。(= Windows XPの場合です。)
o 実行結果を取り出したいコマンド = コマンドは、普通に書いているように書きます。
    + オプション文字列 usebackq の有無で、実行結果を取り出したいコマンドを括る文字が異なります。
        + オプション文字列 usebackq を付けない時、「'」(= 一重の引用符)
        + オプション文字列 usebackq を付ける時、「`」(= 逆引用符)
    + オプション文字列の指定が無い時は、次のように動きます。
        + コマンド実行結果は、半角空白やタブ区切りで、変数に入ります。
            + 都合が悪い時は、オプション文字列 delims を設定します。
        + 文字列の先頭に「;」(= セミコロン)があると、コメントとみなしてFOR文を終了します。
            + 都合が悪い時は、オプション文字列 eol を設定します。
o 実行するコマンド = DO の後に書きます。
    + バッチファイルにこのコマンドを書く時は、変数名を %%i のように%を2つ書きます。
    + 複数並べたい時は、丸括弧(= 小括弧)で括る事も出来ます。
        + 括弧内で「環境変数を設定し、その値を参照する」時には、小技が必要になります。
        + 詳しくは、「バッチファイル。IF文やFOR文の中で複数コマンドを書く時の注意点
    + 大掛かりになる時は、CALL文が便利です。
    + 変数の使い方については、こちらをどうぞ
        + 「%変数の使い方
        + 「環境変数の使い方。置換と部分文字列


**** 戻り値 ( ERRORLEVELの値。確認分のみ )
o (設定なし) = このコマンドは、ERRORLEVELの値を更新しません。
    + 但し、FOR の中で実行するコマンドが ERRORLEVELの値を更新する事があります。
    + 「(ミクさん) の使い方が誤っています。」 = 括弧の前に IN が抜けています。
        + もしくは、変数名の前に付く「%」の数が間違っています。
        + もしくは、オプション文字列に skip=0 を指定しました。


**** 使用例
o コマンドプロンプト画面で動かす時の書き方
--------
rem コマンド実行結果を指定する方法
for /f %i in ('dir /b *.csv') do echo %i

for /f "eol=, delims=, tokens=1,2" %i in ('type "月間葱データ 2011-05.csv"') do echo %i, %j
--------

    + コマンド名やキーワードは、大文字小文字のどちらでも大丈夫です。
    + eol は、読み込みたい文字列の先頭に「;」(= セミコロン)が出てくる時だけ必要です。

o バッチファイルで動かす時の書き方
--------
for /f %%i in ('dir /b *.csv') do echo %%i

for /f "eol=, delims=, tokens=1,2" %%i in ('type "月間葱データ 2011-05.csv"') do echo %%i, %%j
--------

    + 変数名の前に「%」を2つ付けます。


**** 機能
o 最初に、カッコ内に書かれたコマンドを実行します。
o そして、コマンド実行結果を1行ずつ取り出して、1行毎にコマンド実行します。

o コマンド実行結果を読み込む時、実際にデータの入っている行だけを読み込みます。
    + 空行とコメント行はスキップします。
o オプション文字列 eol (= コメント行の開始文字)について
    + Windows XPのヘルプでは、行末指定文字のように書かれていましたが、行の先頭で指定したときだけ有効です。


**** メモ
o オプション文字列 eol を指定しない時も、コマンド実行結果の各行の先頭文字に要注意です。
    + データの先頭に「;」(= セミコロン)が入る行は、スキップ対象になります。
    + 書式欄の説明にある、eolの値を無効にする方法がおすすめです。
    + なお、オプション文字列の最後を eol=" で終えると、「"」が先頭文字になりました。
o 実行時に「More ?」と質問された時は、おそらく文法誤りです。
    + 原因はおそらく、引用符の左右の数が合っていません。
    + とりあえず、「Ctrl」キーを押しながら「C」キーを押すと、止まります。


**** 確認したバージョン
o Windows XP Service Pack 3


==
関連ページ:
    ▼FOR = 繰り返し実行する
    ▼Windowsコマンド。制御文と環境変数▼ABC順
    ▼コマンドプロンプト画面
    ▼制作メモ
    > FOR /F その3 = 指定した文字列の分割結果を取り出して実行する
(2011年5月23日訂正。記号の呼び方。「`」は逆引用符)