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日訂正。記号の呼び方。「`」は逆引用符)

2011年5月20日金曜日

FOR /F その3 = 指定した文字列の分割結果を取り出して実行する方法 - Windowsのコマンドプロンプト(bat,cmd)

WindowsコマンドのFOR
○Windows XP
FOR /F で出来る事、その3です。
文字列を区切り文字で分割して変数に入れ、その変数を使ってコマンド実行する事が出来ます。


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

o コマンド名やキーワードは、大文字小文字のどちらでも大丈夫です。
    + 但し、変数名に限り、大文字小文字を区別します。
o /f = /F オプションです。
o usebackq = 文字列を「'」(= 一重の引用符)で括ります。
    + このオプションを付けない時は、文字列を「"」(= 二重引用符)で括ります。
    + 文字列を分割する時は、オプション文字列 usebackq を付けない事をおすすめします。
        + 文字列を「"」(= 二重引用符)で括ると、文字列中に「)」が出てきた時にも正しく解釈するからです。
o オプション文字列 = 詳しくは「FOR /F その1 = FOR文でファイルを1行ずつ取り出して実行する方法
    + オプション文字列の指定が無い時の動作は、
        + 読み込みたい文字列を「半角空白、もしくはタブ文字」で区切り、最初の1つを取得します。
        + 読み込みたい文字列の先頭が「;」(= セミコロン)の時、コマンドを実行せずにFOR文を終了します。
    + 文字列を分割する時の、おすすめオプション文字列は
        + 「半角空白やタブ」で区切りたい時は、"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 ("ミクさん ツインテール") do echo %iの髪型は、ツインテールです。

for /f "eol=, delims=, tokens=1-2" %i in ("ミクさん,ツインテール") do echo %iの髪型は、%jです。
--------

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

o バッチファイルで動かす時の書き方
--------
for /f %%i in ("ミクさん ツインテール") do echo %%iの髪型は、ツインテールです。

for /f "eol=, delims=, tokens=1-2" %%i in ("ミクさん,ツインテール") do echo %%iの髪型は、%%jです。
--------

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


**** 機能
o 指定した文字列を解析して変数に入れ、コマンドを実行します。
o コマンド内では、解析した変数を使う事が出来ます。

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


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


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


==
関連ページ:
    ▼FOR = 繰り返し実行する
    ▼Windowsコマンド。制御文と環境変数▼ABC順
    ▼コマンドプロンプト画面
    ▼制作メモ
    > GOTO = 指定したラベルに移動する
    CALL = バッチファイルやラベルを呼び出す
    PAUSE = 処理を一時停止する
(2011年5月20日訂正。書式説明の表現見直しと、既定の区切り文字の記述訂正。)

2011年5月19日木曜日

ヨーグルトの目をしたミクさん - ミクさんの隣

ミクさんの隣
私が朝の挨拶をする時、ミクさんは、毎日異なる表情を見せる。
井戸端会議の無い今日は、窓の外を眺めながら、物思いに耽っていた。

「おはようございます。ミクさん。」
「おはよー。」

「何か悩み事ですか。」
「たまには、サイドテールにしてみようかなあ。」
「そういえば、他の髪型にしたミクさんって、見た事がありませんね。」
「だって、2つに分けた方が便利だし。」

確かにそうだ。
ミクさんは、手よりも髪の方が器用なので、1房よりも2房の方が便利なのだ。
とはいえ、たまには違ったお洒落もしてみたいですよね。ミクさん。

「少し試してみましょうか。」
「どうするの?」
「髪の片方持ちますね。」
「わくわく♪」

ミクさんの髪の房は、私の腕には抱えきれなかった。
そこで私は、大きな袋の中に、ミクさんの髪を片方入れてみた。
袋の端に手をかけて、私は袋を持ち上げた。


「準備出来ました。」
「歩いてみるね。」

ミクさんが歩くと共に、私も歩く。
動きがぴったり合った。まるで、ワルツを踊っているみたいだ。
と私が感心している間に、ミクさん、よろける。

ぺし。
髪で叩かれてしまった。


「うまく歩けない。」
「もう一度試してみますか。」
「うん。」

髪を袋に入れる。少し歩く。ミクさんよろける。ぺし。
かれこれ、20回くらい繰り返す。

原因は色々ありそうだけれど、
そもそも、3拍子で歩く所が根本的に変だ。
私はそれを指摘したけれど、ミクさん本人は良く分かっていないみたいだ。
空を飛んだりする反面、根本的な所で不器用なミクさん。
彼女の動きを見る限り、ツインテールと一体化しているとしか思えない。

「続きは明日にしませんか。」
「まだ、歩けるよ。」

ミクさんは、何を隠そう、努力家だ。
彼女が一度何かを決意すると、誰かが止めようとしても、なかなか止める事が出来ない。
彼女は、その後 39回よろめいて、私がミルク休憩を提案した所でようやく中断してくれた。


「ミルクを取ってきますね。」

私は、休憩出来た事に安心し、冷蔵庫に向かった。
ミクさんは、コップを並べていた。
この休憩が終わった頃には、彼女はきっと、別の事を考えている事だろう。
私は、冷蔵庫からミルクの瓶を取り出し、テーブルの方に顔を向けた。
そして、ミクさんの姿を見た私は、全身が石像のように固まった。

私の目は、こう告げる。危険だ。ヨーグルトは非常に危険だ。
ミルクがヨーグルトになったのではない。
休憩中のミクさんの目が、ヨーグルトのようになっている。
そして、あの目が輝きだすと、目的を達成するまでの間、ミクさんの行動は止まらなくなるのだ。


私は、ミルクの瓶を持って、ミクさんの居るテーブルの前に戻った。
そして、ミルクを注ぐ前に深呼吸して、頭の中を整理する。

ミクさんの目の前には、2つのコップが並んでいる。
そして、この休憩中は、ミクさんがリラックス状態になる時が必ず来る。
これから、私は今日の残りの時間を賭けて、運命の女神と勝負する。
下手をすると、明日の運命もこの瞬間に決まってしまう。
私は一度、目を閉じて、今のミクさんの表情を私の脳裏に焼き付けた。


私はゆっくりと目を開き、ミクさんのコップにミルクを注ぐ。
ミクさんは動かない。

私は、自分のコップにもミルクを注ぐ。
ミクさんは、まだ動かない。

私は、ミルクの瓶をテーブルに置き、自分の席に着く。

「どうぞ。」
「いただきます。」

ミクさんが1口飲む。
ミクさんの表情に変化は無い。

ミクさんが2口飲む。
彼女の表情が少し緩む。後少しだ。

ミクさんが3口目を飲もうとした所で、彼女は私に顔を向ける。

「悩み事?」

ミクさんに助け舟を出されてしまった。

「ええ。昨日の曲についてです。」
「私、相談に乗るよ。」
「実は、歌う時のイメージ色を黒にする事を考えているのですけれど。」

私は、新曲の歌い方について、思いついたアイデアを語った。
ミクさんは、そのアイデアに反論し、
彼女がミルクを飲み終わった頃には、昨日の作曲活動の続きをする事になっていた。


ミルク休憩が終わる頃、私はミクさんに関する1つの法則を手に入れた。
冷静に考えれば、ミクさんの暴走を止める事は、簡単な事だったのだ。
彼女にとって、歌う事は、他の何よりも優先順位が高い。
だから、「ミルク休憩に持ち込み」「歌う事に関する話題を持ち出す」。
それだけで、ミクさんを普通の状態に戻す事が出来るのだ。

私は、この法則を「ヨーグルトの法則」と呼ぶ事にした。
何時でも真面目なミクさんが止まらなくなってしまった時の、私達の切り札だ。
きっと、私の知らない所で、ミクさんが苦労している事もあるのだろうなあ。
私は、コップを片付けるミクさんの姿を眺めながら、私自身に向かって苦笑した。


**** 管理情報
o 文章作品
o 作品名 = ヨーグルトの目をしたミクさん
o 分類 = ミクさんの隣
o 作者 = to_dk
o 初出 = 2011-05-19 on Blogger


==
関連ページ:
    ▼ミクさんの隣
    ▼作品紹介
    ▼目次
    > リン警官とミクさん達。第1楽章
    分身するミクさん
    出荷数とミクさん達
(2011年5月19日追加。脳裏に焼き付ける描写)