- ベストアンサー
dosのfor構文の意味について
- dosのfor構文でファイルの一覧表示を行う方法について質問していました。
- 具体的なコマンド例として、for /r c:older1 %i in (*.csv) do @echo %~nxi >> list.txt を使用しました。
- 質問内容は、for文の構文である「%変数」の意味と、使用した一覧表示コマンドの意味(/r,%i,@echo,%~nxi)についてです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
まずは"@echo"について。次のコマンドを実行してみよう。http://oshiete1.goo.ne.jp/qa4360685.htmlのコマンドを簡単にしたものだ。 C:\folder1>for /r c:\folder1 %i in (*.csv) do echo %i 実行するとわかるが、これだとechoコマンド自体が出力されるので表示がうるさい。 C:\folder1>for /r c:\folder1 %i in (*.csv) do echo %i C:\folder1>echo c:\folder1\1.csv <- 1回目のコマンド c:\folder1\1.csv <- 1回目のコマンドの結果 C:\folder1>echo c:\folder1\2.csv <- 2回目のコマンド c:\folder1\2.csv <- 2回目のコマンドの結果 そこで@echoを使う。こうするとコマンドは出力されなくなる。 C:\folder1>for /r c:\folder1 %i in (*.csv) do @echo %i c:\folder1\1.csv <- 1回目のコマンドの結果 c:\folder1\2.csv <- 2回目のコマンドの結果 次に%~nxiの意味。%iが変数であることは既に書いた。上で実行したとおり、変数iにはフルパスのファイル名が入っている。"echo %i"を実行すると、変数の中身はそのまま(つまりフルパスのまま)出力される。 ファイル名を出力するには"%~n変数名"とする。ただし、拡張子は出力されない。ちなみにこの"n"を修飾子と呼びます。 C:\folder1>for /r c:\folder1 %i in (*.csv) do @echo %~ni 1 2 拡張子を出力するには修飾子xを指定して"%~x変数名"とする。 C:\folder1>for /r c:\folder1 %i in (*.csv) do @echo %~xi .csv .csv 修飾子は同時に指定できるので上の2つを合わせて"%~nxi"とする。これで"ファイル名.拡張子"という文字列が出力できる。 C:\folder1>for /r c:\folder1 %i in (*.csv) do @echo %~nxi 1.csv 2.csv ちなみに"%~d変数名"だとドライブ名、"%~p変数名"だとパス名になります。他にもいろいろな修飾子があります。これはヘルプを読めばわかることなので、あとは自分で調べてください。
その他の回答 (3)
>1.for文の構文である「%変数」の変数とは何なのか 質問内容が次のどちらかで説明方法がおおいに違ってくる (1) 変数の概念はわかってる。わからないのはforコマンドにおける変数の使い方だ (2) 変数ってなんのこと? 今回はどっちと判断したかというと、おそらく(2)なんだろうなと。以下、そのつもりで文章を続けます。もし(1)ならこれ以上読むのは時間のムダです。 初心者向けのページを探したが適当なところが見つからなかった。それで自分で説明しようとしたがこれが意外に難しい。正確にと思うと長くて難解になりがち。逆に簡単な説明だと正確さに欠ける。どう説明するかな~と悩んで2日経ってしまった。結局、正確さは犠牲にしてもわかりやすくイメージしてもらうことにした。コンパクトな回答にはならなかったけどできるだけ簡単に理解できるように。正しい知識はまた必要になった時点で覚えてください。 ここからやっと変数の説明に入る。いきなり"変数とは"でなくてまずは次のような状況をイメージしてほしい。 ある作業をAさんとBさんで行うことにした。ある作業とは会員名簿から会員番号の末尾が1の番号をリストアップして別のノートに書き写す作業だ。当然だが作業前にはどんな番号があるかわからない。それでAさんは「番号を見つけたらメモを箱に入れておくよ。箱にはidというラベルを貼っておくよ」とBさんに言う。 作業が始まった。Aさんは最初の番号を見つけて、その番号のメモを箱に入れる。メモが入ったらBさんは箱からメモを取り出して、そこに書かれた番号をノートに書く。Bさんの作業が終わったらAさんは次の番号を探す。以下繰り返してすべての番号を調べたら作業は終了。 さて、この例え話を使ってforコマンドの基本を説明しよう。例として次のコマンドを挙げる。 C:\folder1>for %i in (*.csv) do echo %i このコマンドはカレントディレクトリから拡張子csvのファイルを探し、そのファイル名を表示する。 例え話のAさんはforコマンドで、Aさんの作業はdoの前までだ。Aさんが会員名簿から条件に合う番号を探すように、forコマンドはカレントディレクトリから条件に合うファイル名を探す。このコマンドの場合、条件は「ファイル名の末尾が".csv"」であることだ。 条件に合うファイル名が見つかるとforコマンドはそれを「変数」に入れる。これは例え話でいう「箱」にあたる。箱の名前(=変数名)はiだ。コマンドプロンプトでは変数名の前に%を付けるという決まりがあるので、"for %i ..."という表現になる。 次はBさんが作業に入る。Bさんはechoコマンドだ。既に回答があるがechoコマンドはコマンドに続く続く文字列を出力する。例えば次のようにすれば"hello"という文字列を出力する。 C:\folder1>echo hello hello 今回はechoコマンドに続くのが文字列ではなく変数になっている。この場合は変数の中身を出力する。今、変数iにはforコマンドがファイル名を入れているのでechoコマンドはそのファイル名を出力する。ここまでが1個目のファイルを見つけたときの動き。次は2個目のファイルを探しにいき、あればまた変数に入れ、変数の内容を出力する。以下くりかえし。 これでやっと変数とechoコマンドの説明が終わる。今回の内容がわからないと他の質問に答えてもよく理解できないだろうと思う。したがって変数が理解できたら補足にちょいと書いといてください。わかりにくい部分もあると思うのでその場合も疑問点を補足してください。変数が理解できたところで残りの質問に回答します(これは簡単に説明できると思います)。
お礼
回答ありがとうございます。 とても詳しく分かりやすい説明ありがとうございます。おかげさまで「変数」の意味がよく分かりました。 最後に「@echo,%~nxi」の意味だけお伺いしてもよろしいでしょうか??
- jjon-com
- ベストアンサー率61% (1599/2592)
@echo はこちらを参照。 http://www.confrage.com/dos/batch-grammar/echo/echo.html 残りについては基本的にANo.1に賛成です。Webでヘルプを読みたければこちらを参照。 http://okwave.jp/qa4003970.html の私の過去の回答ANo.1 >1.for文の構文である「%変数」の変数とは何なのか という基本をまず理解しなければ話にならないので,上記で紹介したコマンドリファレンスのページの最後に一気に飛んで,次のfor文の理解から始めてはいかがですか。 >例 >for %f in (*.doc *.txt) do type %f %f は適当に名付けられた変数名ですので,%i に書き換えてもまったく同じ意味です。
お礼
回答ありがとうございます。
- koko_u_
- ベストアンサー率18% (459/2509)
とりあえず C:\>help for で表示されるドキュメントを読んでから、もう一度質問してね。
お礼
回答ありがとうございます
お礼
お礼が遅れて申し訳ありません。 大変詳しい回答ありがとうございました。 初歩的な質問にお付き合い下さり感謝しております。