バッチファイルのfor文について
◇-?バッチファイルのfor文について-ひろ-04/07-10:11(276)-No.474746 ┣?!Re:バッチファイルのfor文につい...-pandora-04/07-12:07(274)-No.474750 ┃ ┗?!?Re:バッチファイルのfor文につ...-ひろ-04/07-14:19(272)-No.474755 ┃ ┗?!?!Re:バッチファイルのfor文につ...-pandora-04/07-15:40(271)-No.474758 ┃ ┗?!?!?Re:バッチファイルのfor文に...-ひろ-04/07-17:30(269)-No.474759 ┃ ┗?!?!?!Re:バッチファイルのfor文に...-pandora-04/07-18:42(268)-No.474762 ┃ ┗?!?!?!!Re:バッチファイルのfor文...-ひろ-04/07-21:31(265)-No.474776 ┗?!Re:バッチファイルのfor文につい...-AZ-04/07-12:08(274)-No.474751 ┗?!!Re:バッチファイルのfor文につ...-ひろ-04/07-21:35(265)-No.474777
▲このページのトップに戻る
▲このページのトップに戻る
▲このページのトップに戻る
▲このページのトップに戻る
▲このページのトップに戻る
▲このページのトップに戻る
▲このページのトップに戻る
▲このページのトップに戻る
▲このページのトップに戻る
474746 | バッチファイルのfor文について | ひろ | 2009/04/07-10:11 |
メーカー名:日立製作所 OS名:WindowsXp Professional パソコン名:HP トラブル現象:インターネット全般その他 プログラミング -- はじめまして。 いつも参考にさせていただいております。 バッチファイルのfor文について質問させて頂きます。 フォルダ構成が以下のようになっている時 C:\Documents and Settings\Users\My Documents\Test1\temp C:\Documents and Settings\Users\My Documents\Test1\temp1 C:\Documents and Settings\Users\My Documents\Test1\temp2 C:\Documents and Settings\Users\My Documents\Test2\temp C:\Documents and Settings\Users\My Documents\Test2\temp1 C:\Documents and Settings\Users\My Documents\Test2\temp2 C:\Documents and Settings\Users\My Documents\Test3\temp C:\Documents and Settings\Users\My Documents\Test3\temp1 C:\Documents and Settings\Users\My Documents\Test3\temp2 C:\Documents and Settings\Users\My Documents\Test4\temp C:\Documents and Settings\Users\My Documents\Test4\temp1 C:\Documents and Settings\Users\My Documents\Test4\temp2 C:\Documents and Settings\Users\My Documents\Test5\temp C:\Documents and Settings\Users\My Documents\Test5\temp1 C:\Documents and Settings\Users\My Documents\Test5\temp2 Test1〜5フォルダのTemp1とTemp2のフォルダとその中身のファイルを削除する(数字が付かないTempフォルダは残す) バッチファイルを作りたいと思っていますがなかなか上手くいきません。 色々調べた結果以下のように記述してみたのですが、期待した結果は得られませんでした。 cd "C:\Documents and Settings\Users\My Documents" for /d %%a in ('dir /s /ad Temp1') do rmdir /s /q %%a for /d %%a in ('dir /s /ad Temp2') do rmdir /s /q %%a コマンドプロンプトで実行した結果、 rmdir /s /q 'dir 指定されたファイルが見つかりません。 rmdir /s /q /s コマンドの構文が誤っています。 rmdir /s /q /ad 無効なスイッチです - "ad" rmdir /s /q bin' 指定されたファイルが見つかりません。 のようなエラーが表示されています。 記述した、()内で検索を行う処理を書いたつもりなのですが、半角スペースで分割されてしまっています。 どのように記述すれば結果が得られるのか教えてもらえませんでしょうか? よろしくお願いいたします。 |
▲このページのトップに戻る
474750 | Re:バッチファイルのfor文について | pandora | 2009/04/07-12:07 |
記事番号474746へのコメント ひろさんは No.474746「バッチファイルのfor文について」で書きました。 DOSバッチ FOR文は、unix sh のそれよりも、遥かに頭が悪く融通も利かなくて DO内の構文がちょっと複雑になると、文法上間違いが無くてもコケます 以下のように同等の機能を実行する別文にした方がよいかと 参考文献 http://www.fpcu.jp/dosvcmd/index.htm http://itpro.nikkeibp.co.jp/free/NT/WinKeyWord/20040805/1/ ::----ここから---- @ECHO OFF SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION rem System Define SET USERNAME=Users rem Start Remove Folder SET DIRPATH=C:\Documents and Settings\%USERNAME%\My Documents SET DIR1=1 :LOOP1 SET DIR2=1 :LOOP2 SET SERCHPATH=%DIRPATH%\Test!DIR1!\temp!DIR2! echo !SERCHPATH! rem Remove Folder IF EXIST "!SERCHPATH!" RMDIR "!SERCHPATH!" /S /Q >NUL rem Set Next SerchPath SET /A DIR2=!DIR2!+1 IF /I !DIR2! LEQ 2 GOTO :LOOP2 SET /A DIR1=!DIR1!+1 IF /I !DIR1! LEQ 5 GOTO :LOOP1 pause ::----ここまで---- |
▲このページのトップに戻る
474755 | Re:バッチファイルのfor文について | ひろ | 2009/04/07-14:19 |
記事番号474750へのコメント pandoraさんは No.474750「Re:バッチファイルのfor文について」で書きました。 pandora様 AZ様 ご解答ありがとうございました。 ソースを見させていただいてから、いい忘れていたことが発覚しました。 大変申し訳ございませんでした。 上記のフォルダ構成は簡潔にするためにTest1〜5としましたが、 実際のフォルダ構成ではこのTest1〜5にあたるフォルダ名はまったく関係のない名前となっております。 (消したいフォルダ名は固定ですが、フォルダどうしの名前に関係性はありません) 例: C:\Documents and Settings\Users\My Documents\Test\temp C:\Documents and Settings\Users\My Documents\Test\aaa C:\Documents and Settings\Users\My Documents\Test\bbb C:\Documents and Settings\Users\My Documents\Result\temp C:\Documents and Settings\Users\My Documents\Result\aaa C:\Documents and Settings\Users\My Documents\Result\bbb C:\Documents and Settings\Users\My Documents\Answer\temp C:\Documents and Settings\Users\My Documents\Answer\aaa C:\Documents and Settings\Users\My Documents\Answer\bbb C:\Documents and Settings\Users\My Documents\Question\temp C:\Documents and Settings\Users\My Documents\Question\aaa C:\Documents and Settings\Users\My Documents\Question\bbb C:\Documents and Settings\Users\My Documents\Doubt\temp C:\Documents and Settings\Users\My Documents\Doubt\aaa C:\Documents and Settings\Users\My Documents\Doubt\bbb といった感じになります。 pandora様のソースを見て書いてみたのですが、よくわからなくなってしまいました。 SET DIRPATH=C:\Documents and Settings\Users\My Documents\ SET DIR1=Test SET DIR2=Result SET DIR3=Answer SET DIR4=Question SET DIR5=Doubt SET DELETEFOLDER1=aaa SET DELETEFOLDER2=bbb SET NUM=1 SET NUMBER=1 SET SERCHPATH=%DIRPATH%\%DIR!NUM!%\%DELETEFOLDER!NUMBER!% このように変数をネスト構造で記述したのですが、上手くいきませんでした。 このようなフォルダ構成でもLOOP文を使って記述することはできるのでしょうか? 出来るか出来ないかの回答だけでもいただけないでしょうか。 よろしくお願いいたします |
▲このページのトップに戻る
474758 | Re:バッチファイルのfor文について | pandora | 2009/04/07-15:40 |
記事番号474755へのコメント ひろさんは No.474755「Re:バッチファイルのfor文について」で書きました。 なるほどね 複数のユニークなフォルダが対象ですか そうなると、私の提示した方法ではシンプルさをなくします #出来ないわけではない・・・複雑になるって話 AZさんの提示されたFOR文は、サブディレクトリの中までサーチするようになってるので それを素直に利用した方がすっきりするでしょね 例えばこんな感じでね #たぶん要望される仕様は満たしてるはず ちなみに、 DOSバッチでは、変数を使用する場合 8文字以下(先頭は英文字)にしないとNGです 9文字以上になると、最初の 8文字だけが有効になります したがって、 >SET DELETEFOLDER1=aaa >SET DELETEFOLDER2=bbb とすると、DELETEFO=bbb しか有効になりません(aaaはbbbに上書きされ消える) ::----ここから---- @ECHO OFF SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION rem System Define SET USERNAME=Users SET DELNUMBER=3 SET DELNAME1=aaa SET DELNAME2=bbb SET DELNAME3=ccc rem Start Remove Folder SET DIRPATH=C:\Documents and Settings\%USERNAME%\My Documents echo %DIRPATH% CD /D %DIRPATH% CD FOR /L %%I IN (1, 1, %DELNUMBER%) DO ( SET DELETEFOLDER=!DELNAME%%I! IF /I NOT "!DELETEFOLDER!"=="" ( ECHO DeleteFolder: !DELETEFOLDER! FOR /F %%A IN ('DIR /S /AD /B !DELETEFOLDER!') DO ( ECHO %%A RMDIR "%%A" /S /Q >NUL ) ) ) pause ::----ここまで---- P.S. 本当は、半角スペースを入れて入れ子構造を付けてるんだけど 貼り付けると半角スペースが排除されちゃうので、全角スペースに置き換えてます 全角スペースでは実行できないので、それを半角スペースに置換してください あと、 ここでは SET USERNAME=Users とユーザー名を固定にしてますが、 バッチからVBScriptを起動しダイアログ画面を表示させて、K/B入力することも出来ます それは、自分で勉強してください http://www.whitire.com/vbs/ http://tryasp.winscom.co.jp/document/vbscript/vbstoc.htm あと、 環境変数 %USERPROFILE% を利用すると、現在ログオンしてるユーザーの Documents and Settings PATHを入手できるって知ってました? |
▲このページのトップに戻る
474759 | Re:バッチファイルのfor文について | ひろ | 2009/04/07-17:30 |
記事番号474758へのコメント pandoraさんは No.474758「Re:バッチファイルのfor文について」で書きました。 pandora様 度々お世話になります。自分の環境に合わせて記述し、実行したのですが一箇所だけ上手くいかない場所がありました。 以下に実行結果の一部を書かせていただきます。 ----------------実行結果の一部------------------------------------------------ SETLOCAL ENABLEEXTENSIONS ENABLED ELAYEDEXPANSION rem System Define SET DELNUMBER=3 SET DELNAME1=aaa SET DELNAME2=bbb SET DELNAME3=Temp rem Start Remove Folder SET DIRPATH=C:\Documents and Settings\User\My Documents\Work echo C:\Documents and Settings\User\My Documents\Work CD /D C:\Documents and Settings\User\My Documents\Work CD FOR /L %I IN (1 1 3) DO ( SET DELETEFOLDER=!DELNAME%I! IF /I NOT "!DELETEFOLDER!" == "" ( ECHO DeleteFolder: !DELETEFOLDER! FOR /F %A IN ('DIR /S /AD /B "!DELETEFOLDER!"') DO ( ECHO %A RMDIR "%A" /S /Q 1>NUL ) ) ) ( SET DELETEFOLDER=!DELNAME1! IF /I NOT "!DELETEFOLDER!" == "" ( ECHO DeleteFolder: !DELETEFOLDER! FOR /F %A IN ('DIR /S /AD /B "!DELETEFOLDER!"') DO ( ECHO %A RMDIR "%A" /S /Q 1>NUL ) ) ) DeleteFolder: aaa ( ECHO C:\Documents RMDIR "C:\Documents" /S /Q 1>NUL ) C:\Documents 指定されたファイルが見つかりません。 ----------------実行結果の一部------------------------------------------------ DeleteFolder: aaa というのがしっかり表示されているので、問題となっているのは最後のFor文 FOR /F %%A IN ('DIR /S /AD /B !DELETEFOLDER!') DO ( ECHO %%A RMDIR "%%A" /S /Q >NUL ) ここで%%Aのパスが半角スペースで切れてしまっているのですが、 どこの時点で""(ダブルクオーテーション)で囲めば良いのでしょうか? For文のDIR文内の!DELETEFOLDER!を""で括ると、DIR文が成立しないようですし、 FOR /F "%%A" IN ('DIR /S /AD /B !DELETEFOLDER!') DO ( としてもダメみたいでお手上げ状態です。 フォルダパスをスペースのないCドライブ直下に置いて試してみたところ、希望通りの実行結果を得ることが出来ましたっ !! >環境変数 %USERPROFILE% を利用すると、現在ログオンしてるユーザーの Documents and Settings PATHを入手できるって知ってました? 知りませんでした・・・。 今回のバッチファイルはあくまで自分の環境のみで実行することを前提としていましたので、 そこまで考えが回りませんでしたが、自分以外の環境で実行するならば、そういったことも必要なのだと納得しました。 |
▲このページのトップに戻る
474762 | Re:バッチファイルのfor文について | pandora | 2009/04/07-18:42 |
記事番号474759へのコメント ひろさんは No.474759「Re:バッチファイルのfor文について」で書きました。 あらぃやん 半角スペースでセパレートされちゃったんですね #FOR文は出力をデフォルトで、半角スペースセパレートするの忘れてた #失礼 (あれの残りはセパレートするごとに %%B、%%C・・・ と入れられる) FOR /F %%A IN ('DIR /S /AD /B !DELETEFOLDER!') DO ( を FOR /F "USEBACKQ TOKENS=1* DELIMS=" %%A IN (`DIR /S /AD /B !DELETEFOLDER!`) DO ( にそっくり入れ替えてください 変更点は2つ ・"USEBACKQ TOKENS=1* DELIMS=" の追加 ・()の中のくくりを ' (シングルクォート)から ` (逆シングルクォート)に修正 --(追記)-- って、もう AZさんのほうからよりシンプルな改造コードが出てたのね |
▲このページのトップに戻る
474776 | Re:バッチファイルのfor文について | ひろ | 2009/04/07-21:31 |
記事番号474762へのコメント pandoraさんは No.474762「Re:バッチファイルのfor文について」で書きました。 無事、私の実行環境でも期待通りのバッチファイルを作成することができました。 動きはしたものの、まだ ' (シングルクォート)と ` (逆シングルクォート)の違いやその他文法で分からないことが多いので、 一歩一歩確実に勉強していきたいと思います。 この度は、長い間お付き合いしていただいて、ありがとうございました。 |
▲このページのトップに戻る
474751 | Re:バッチファイルのfor文について (追加訂正) | AZ | 2009/04/07-12:08 |
記事番号474746へのコメント for文の /d オプションではなく /f オプションを使います あとdir コマンドに /bをつけて余計な者をなくすだけでOKでしょう こんな感じで for /f %%a in ('dir /s /ad /b Temp1') do rmdir /s /q %%a ======== 18:17 下記を追加=========== 上記だとパス名に半角がある場合に処理できませんでしたね 次のようにして、区切子を変更して回避して下さい for /f "delims=*" %%a in ('dir /s /ad /b Temp2') do rmdir /s /q "%%a" |
▲このページのトップに戻る
474777 | Re:バッチファイルのfor文について (追加訂正) | ひろ | 2009/04/07-21:35 |
記事番号474751へのコメント AZさんは No.474751「Re:バッチファイルのfor文について (追加訂正)」で書きました。 私の実行環境で期待通りの動作が確認できました。 まさか、1行で解決できるとは思っていなかっただけに驚きました・・・。 >区切子を変更して回避して下さい まだ、これでどうして回避できるのかさっぱりわかりませんが これから頑張って、勉強していきたいと思っています。 この度は、本当にありがとうございました。 |
何か一言(本ページで参考になったならないを含めて残してあります)
◎:解決 ○:参考になった ×:参考にならなかった !:アドバイスあり
参考 | 回数 | 投稿日時 | 何か一言 |
---|