none
一定期間で削除のバッチ【3】 RRS feed

  • 質問

  • いつもお世話になっております。

    先日も同様の内容で質問させていただいたものです。

    下記が初回の質問です。

    https://social.technet.microsoft.com/Forums/ja-JP/85f5c2c0-143a-4bde-abb7-4fd4077c9379/action?threadDisplayName=1996823450263993829112391210663850012398124961248312481

    この初回の内容を元に理想の挙動をするバッチを作成出来たのですが、エラー時の対応が出来ておりませんでした。

    エラーというのは該当フォルダが見つからなかった時に処理を中止するというものです。

    下記が2回目の質問時のバッチの中身です。

    ------------------------------------------------------

    pushd \\192.168.2.4\山田 太朗\Backup(tyamada)
    forfiles /d -180 /s /c "cmd /c del /q @path"
    popd

    ------------------------------------------------------

    そこで、前回の質問ではif文の処理方法について教えていただき、対応しようと試みました。

    しかし作成時に思ったのは何かの際にメンテナンスが大変そうだという部分で、やはりシンプルな内容で作成したいと思いました。

    今回、私が構想した内容は最初にカレントディレクトリをcdで移動し、その後に上記の3行のコマンドを実施するというものです。

    以前、上記3行のみでエラーを想定してテストを試みました。対象のフォルダが無かった時の挙動を確認しました。

    すると、デフォルトのカレントディレクトリがバッチを実行したPCデスクトップだったのですが、デスクトップ上の条件に当てはまるファイル全てが消えました。

    これを回避するには、カレントディレクトリを安全な場所へ移動してからの実行かと思います。そうすれば、複雑なif文も必要なくなるかと思います。

    どこか、データが入っていないような安全な場所はありますでしょうか。(極論、自分でそういうフォルダを作成してそこにcdコマンドで飛ぶしかないかと思いますが)

    cdコマンドには~\や\があるかと思いますが、これが具体的にどこのことを指すのかがわからなかったので、もしかして処理の為の仮想の場所等があったりするのかと思いました。

    何卒よろしくお願いします。

    2015年7月28日 0:47

回答

  • oooohです。

    >UNCパスだと検索対象にならないのでしょうか。

    検証しましたが判別可能です。

    ループバックアドレスですぐ分かることですからそれくらいやりましょう。

    おそらく実行アカウントの権限が対象フォルダに対して足りないだけです。

    • 回答としてマーク mizuho524 2018年12月19日 7:01
    2015年8月6日 11:24

すべての返信

  • oooohです。

    前回の質問見ましたが、頭に

    if exist "\\192.168.2.4\山田 太朗\Backup(tyamada)" の判定を入れたらそれでいいんではないですかね?

    まぁ、これが複雑って言われたらそれまでですけど。


    • 編集済み ooooh 2015年7月28日 4:00 コマンドの修正
    • 回答の候補に設定 佐伯玲 2015年7月30日 1:06
    2015年7月28日 3:50
  • kkitaura さま よろしく。

    しかし作成時に思ったのは何かの際にメンテナンスが大変そうだという部分で、やはりシンプルな内容で作成したいと思いました。

    とありますが、実際に、コマンド内にフォルダ名を固定で書いている限り(所謂、ハードコード)、避けられません。

    ヒントです。

    for /d %f in (*) do echo %f

    を echo off で実行して見て下さい。 (カレントのディレクトリを変数に取得)
    この echo %f の部分を、
    今回のご質問のバッチで指定フォルダを変数(コマンドライン引数(パラメータ))に押し出したものに変更し、
    これを呼び出せば OK です。
    つまり、ふたつのバッチを作り、パラメータ %f 付きで 片方を Call しましょう。

    補足
    ご提示のバッチ3行を、コマンドラインの引数でフォルダ名を指定する形に直します。
    別のバッチを作ります。
     \\192.168.2.4\ のフォルダを取得します。 for /d %f1 in (*)
     各フォルダで Backup で始まるサブフォルダを取得します。 for /d %f2 in (Backup*)
    フォルダ構成にもよりますが、 for /d /r %f in (Backup*) do echo %f で取れる気がします。 試して。
                 サブフォルダ下層に Backup で始まるフォルダがない場合。
    問題なければ、% を %% に echo を call [バッチ名] %f に 換え、バッチにします。



    • 編集済み ShiroYuki_Mot 2015年7月28日 6:24 補足追加
    • 回答の候補に設定 佐伯玲 2015年7月30日 1:06
    2015年7月28日 5:30
  • ooooh様

    ご回答ありがとうございます。

    極力if文を避けたかったのですが、不可能かと思いました。ooooh様の御回答はとてもシンプルで

    実用向きかと思いました。早速試してみます。

    2015年7月28日 7:07
  • ShiroYuki_Mot様

    毎度丁寧な御回答ありがとうございます。

    詳細な補足もつけていただきとても勉強になります。時間はかかるかと思いますが、少しづつ理解しながら試してみたいと

    思います。

    2015年7月28日 7:08
  • kkitaura さま 拝見しました。

    今回の方法は、実際にあるフォルダを列挙させますので、これさえ上手く書ければ、 if 文は不要です。

    この手のバッチの怖いのは、例外があった場合です。 この例では、サブフォルダ内に Backup で始まるフォルダが存在した場合です。

    運用上の工夫をするか、 画面表示させて対話的に作業の続行中断を選べる様に書くか だとも思います。

    • 回答の候補に設定 佐伯玲 2015年7月30日 1:06
    2015年7月28日 7:36
  • oooohです。

    >極力if文を避けたかったのですが、不可能かと思いました。

    if文使いたくないなら問答無用で頭に

    mkdir "\\192.168.2.4\山田 太朗\Backup(tyamada)"

    でもOKですよ。既に存在したら次のコマンドに流れますし。

    結果としては同じです。

    • 回答の候補に設定 佐伯玲 2015年7月30日 1:06
    2015年7月28日 12:18
  • ooooh様

    お世話になっております。

    御連絡遅くなりすみませんでした。

    まずooooh様の仰るように該当のフォルダを検索するコマンドの作成を始めました。

    下記のサイトを見ると、パスの中に空白を使用しているとexistコマンドが使用できないようです。特にフォルダ参照でnulを使用したい

    場合。

    http://www.atmarkit.co.jp/ait/articles/0008/04/news002_2.html

    そこで、そのサイトに書いてあるように以下の内容を考えました。

    -------------------------------------------------------------------------------

    echo off
    dir "\\192.168.2.4\山田 太朗\Backup(tyamada)\nul" 2>nul | find "<DIR>          .." >NUL

    if not errorlevel 1 ( echo folder exist ) else echo Nothing

    -------------------------------------------------------------------------------

    しかし、これを実行したところ実行結果はNothingとなってしまいます。

    UNCパスだと検索対象にならないのでしょうか。

    御連絡お待ちしております。


    • 編集済み mizuho524 2015年8月5日 4:09
    2015年8月5日 2:06
  • oooohです。

    >UNCパスだと検索対象にならないのでしょうか。

    検証しましたが判別可能です。

    ループバックアドレスですぐ分かることですからそれくらいやりましょう。

    おそらく実行アカウントの権限が対象フォルダに対して足りないだけです。

    • 回答としてマーク mizuho524 2018年12月19日 7:01
    2015年8月6日 11:24