バッチファイルの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'
指定されたファイルが見つかりません。

のようなエラーが表示されています。

記述した、()内で検索を行う処理を書いたつもりなのですが、半角スペースで分割されてしまっています。

どのように記述すれば結果が得られるのか教えてもらえませんでしょうか?
よろしくお願いいたします。

▲このページのトップに戻る
474750Re:バッチファイルの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

::----ここまで----

▲このページのトップに戻る
474755Re:バッチファイルの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文を使って記述することはできるのでしょうか?
出来るか出来ないかの回答だけでもいただけないでしょうか。
よろしくお願いいたします

▲このページのトップに戻る
474758Re:バッチファイルの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を入手できるって知ってました?

▲このページのトップに戻る
474759Re:バッチファイルの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を入手できるって知ってました?

知りませんでした・・・。
今回のバッチファイルはあくまで自分の環境のみで実行することを前提としていましたので、
そこまで考えが回りませんでしたが、自分以外の環境で実行するならば、そういったことも必要なのだと納得しました。

▲このページのトップに戻る
474762Re:バッチファイルの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さんのほうからよりシンプルな改造コードが出てたのね

▲このページのトップに戻る
474776Re:バッチファイルのfor文についてひろ 2009/04/07-21:31

記事番号474762へのコメント
pandoraさんは No.474762「Re:バッチファイルのfor文について」で書きました。

無事、私の実行環境でも期待通りのバッチファイルを作成することができました。
動きはしたものの、まだ ' (シングルクォート)と ` (逆シングルクォート)の違いやその他文法で分からないことが多いので、
一歩一歩確実に勉強していきたいと思います。
この度は、長い間お付き合いしていただいて、ありがとうございました。

▲このページのトップに戻る
474751Re:バッチファイルの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"

▲このページのトップに戻る
474777Re:バッチファイルのfor文について (追加訂正)ひろ 2009/04/07-21:35

記事番号474751へのコメント
AZさんは No.474751「Re:バッチファイルのfor文について (追加訂正)」で書きました。

私の実行環境で期待通りの動作が確認できました。
まさか、1行で解決できるとは思っていなかっただけに驚きました・・・。

>区切子を変更して回避して下さい
まだ、これでどうして回避できるのかさっぱりわかりませんが
これから頑張って、勉強していきたいと思っています。

この度は、本当にありがとうございました。

A1.本ページは参考になりましたか? 又はアドバイスがありますか?
解決 参考になった 参考にならなかった アドバイスする

A2.何度目の訪問ですか?
初めて来た   数度目(2〜4) 5回以上来ている   管理人:

A3.何か一言どうぞ(アドレスは書くことができません)

A4.アドレスがあればどうぞ(1つまで)


↑↑↑↑よろしければ押してください↑↑↑↑

何か一言(本ページで参考になったならないを含めて残してあります)
◎:解決 ○:参考になった ×:参考にならなかった !:アドバイスあり

参考回数投稿日時何か一言