525) 実行結果を変数に格納するには HIDE 2003/08/11(月) 15:41 |
|
こんにちわ DOSコマンド初心者です。 バッチファイル内で使用する、変数についてお伺いしたいことがあります。 バッチファイル内で実行したコマンドの結果を変数に格納したいのですがどのようにすれば、格納できるのでしょうか? 例)dir C:\|find /C "aaa" 2 ↑これを変数に格納したい。 ご存知の方ご教授願えないでしょうか。 |
|
526) Re:実行結果を変数に格納するには ふぇむ 2003/08/11(月) 15:59 |
|
>バッチファイル内で実行したコマンドの結果を変数に格納したいのですがどのようにすれば、格納できるのでしょうか? >例)dir C:\|find /C "aaa" >2 >↑これを変数に格納したい。 こんな感じでどうでしょうか。(Windows2000以降/もしかするとNT4.0でもいけるかも) for /f %%z in ('dir C:\ ^| find /C "aaa"') do set COUNT=%%z |
|
527) Re2:実行結果を変数に格納するには HIDE 2003/08/12(火) 00:16 |
|
>こんな感じでどうでしょうか。(Windows2000以降/もしかするとNT4.0でもいけるかも) > >for /f %%z in ('dir C:\ ^| find /C "aaa"') do set COUNT=%%z > 回答ありがうございます。 試して見ました。変数ZをECHOで出力し、確認しようとしたのですが 表示されません。変数に格納されていないのか、確認の方法が間違っているのかわかりません。 ECHO %Z% またコマンド中の「^」には、どんな意味があるのでしょうか。 初心者のため質問がくだらないかもしれませんが、ご教授願えないでしょうか。 よろしくお願いします。 |
|
528) Re3:実行結果を変数に格納するには ふぇむ 2003/08/12(火) 10:49 |
|
>>for /f %%z in ('dir C:\ ^| find /C "aaa"') do set COUNT=%%z >> >試して見ました。変数ZをECHOで出力し、確認しようとしたのですが >表示されません。変数に格納されていないのか、確認の方法が間違っているのかわかりません。 >ECHO %Z% 上記で使っている変数 %z はfor文の中だけの変数(for /? 参照のこと)なので、それを外に返すために set COUNT=%%z で変数COUNTにセットしているわけです。結果は %COUNT% で参照します。 ということで、上記の後で結果を参照するなら ECHO %COUNT% です。 >またコマンド中の「^」には、どんな意味があるのでしょうか。 コマンドライン上で意味のある記号の意味を打ち消して文字として扱うためのエスケープ文字です。 Windows2000の [スタート>ヘルプ]から立ち上がるヘルプ画面で、リファレンス→Windows2000コマンドリファレンス→条件付き処理記号を見ると、 キャレット (^) を使うと、コマンド記号をテキストとして使用できます (その記号の特殊な意味は無視されます)。 と書いてあります。 |
|
534) Re4:実行結果を変数に格納するには HIDE 2003/08/13(水) 00:27 |
|
>>>for /f %%z in ('dir C:\ ^| find /C "aaa"') do set COUNT=%%z >>> >>試して見ました。変数ZをECHOで出力し、確認しようとしたのですが >>表示されません。変数に格納されていないのか、確認の方法が間違っているのかわかりません。 >>ECHO %Z% > >上記で使っている変数 %z はfor文の中だけの変数(for /? 参照のこと)なので、それを外に返すために set COUNT=%%z で変数COUNTにセットしているわけです。結果は %COUNT% で参照します。 >ということで、上記の後で結果を参照するなら > >ECHO %COUNT% > >です。 > >>またコマンド中の「^」には、どんな意味があるのでしょうか。 > >コマンドライン上で意味のある記号の意味を打ち消して文字として扱うためのエスケープ文字です。 >Windows2000の [スタート>ヘルプ]から立ち上がるヘルプ画面で、リファレンス→Windows2000コマンドリファレンス→条件付き処理記号を見ると、 > >キャレット (^) を使うと、コマンド記号をテキストとして使用できます (その記号の特殊な意味は無視されます)。 > >と書いてあります。 > > 回答ありがとうございます。 解決しました。 ちなみにもう一点お聞きしてもよいでしょうか。 dir /b | fined "aaa">temp.txt と書いた場合でtemp.txtファイルの内容が複数行ある場合、 その内容を順次(1行目、2行目・・・)変数に格納することは、可能でしょうか。 教えていただけたら幸いです。 |
|
535) Re5:実行結果を変数に格納するには ふぇむ 2003/08/13(水) 10:59 |
|
>dir /b | fined "aaa">temp.txt >と書いた場合でtemp.txtファイルの内容が複数行ある場合、 >その内容を順次(1行目、2行目・・・)変数に格納することは、可能でしょうか。 >教えていただけたら幸いです。 コマンドバッチスクリプトの世界では、配列変数に直接相当するものはないので、「変数に格納」とおっしゃる意味がそのような配列変数を意味するのであれば、それはなかなか困難です。 しかし、「繰り返し処理をするために」ということであれば、for 文を利用して実現することはできると思います。for /? をご覧になって考えてみて下さい。 なお、Windows2000では、 dir /b | find "aaa" みたいにしなくても、dir /b "*aaa*" で aaa を含むファイルないしディレクトリは拾えます。NT4.0では全てにマッチしてしまったかもしれませんが... また、Windows2000 の find は、そのままでは大文字小文字を区別するようで、区別させない場合は /i というオプションが必要です。これも NT4.0 ではどうだったかわかりませんが、 find "aaa" というのは find /i "aaa" でなくて大丈夫でしょうか? |
|
536) Re6:実行結果を変数に格納するには HIDE 2003/08/13(水) 12:01 |
|
では、「ゆか」さんがやろうとしていることは、難しいのでしょうか。 私も結果的には、似たようなことがやりたいのですが。 |
|
538) Re7:実行結果を変数に格納するには ふぇむ 2003/08/13(水) 14:02 |
|
>では、「ゆか」さんがやろうとしていることは、難しいのでしょうか。 >私も結果的には、似たようなことがやりたいのですが。 for /? を見るとすぐわかると思いますが、例えば、テキストファイルで、1行が1レコードで、各レコードがあるセパレータで区切られたような、データソースファイルがあるとします。 簡単のために、ファイル名を datasource.txt として、各データは半角英数のみで構成され、フィールドの区切りは空白であるとします。こんな感じ。 01 20020310 ABCDE 3 02 20020410 XYZ 5 03 20020510 PQRS 4 04 20020610 HIJK 7 これを、 for /f %%a "tokens=1-4" in (datatource.txt) do call :SUBROUTINE %%a %%b %%c %%d みたいにすると、datasource.txt の最初の行から最後の行まで順にループしつつ、:SUBROUTINE 側 では各行(1レコード)の各フィールドが 引数 %1 %2 %3 %4 として参照できます。 HIDE さんのやりたいことも、上記のような形で実現できると思います。 1レコード1フィールドのリストファイルがいったんできれば、 for /f %%a in ( listfile.txt ) do call :SUBROUTINE %%a みたいな形でしょうね。また、listfile.txt が動的につくられる中間ファイルであるなら、 for /f %%a in ( 'listfile.txt と同じ内容を標準出力に吐き出すコマンド' ) do call :SUBROUTINE %%a という形で、中間ファイルを生成せずにできます。 ただ、DOSコマンドには結構各種制約やら"くせ"があるので、なんらかのトラップに引っかかる可能性があります。 |
|
545) Re8:実行結果を変数に格納するには HIDE 2003/08/14(木) 10:45 |
|
ありがとうございます。 とても参考になりました。 |