2020年11月3日火曜日

PC フォルダ構造のみをコピー 改訂

以前の投稿 PC フォルダ構造のみをコピー  は、
現行 OS では、既に、機能していませんでした。
何時頃から 無意味だった のかは分かりませんが、
恐らく、Robocopy の仕様変更なのでしょう。


以前 ご紹介した フォルダ構造をコピーする コマンド は、
現行 OS (Windows 10 version 2004/20H2) では、
更新には成功した様なコマンドアウトプット(経過報告)を返しますが、
実際のファイルシステム上ではコピーされません。

そう、こんな コマンド でしたね。

Robocopy SourceDir ExtensionDir /S /Dcopy:T /XF:*.*

あれっ!、動かないぞ!。
おや?、また トラブルか?、と一瞬訝しく思った訳ですが、
違います。
記述にミスがある(/XF の後の、 : は間違いで、半角スペースが正)のでした。
また、
オプション記述の /S と /E との違いを思い出しましょう。
/S は空フォルダをスキップし、
/E は空フォルダを扱います。
以前は、/S でも フォルダ生成 してくれていましたが、
生成結果が空フォルダになるか否か は 関係無い 動作でした。  だった筈です。

それが、
現行の Robocopy は、/S の場合、生成結果をも反映して処理している様です。
ですから、
空フォルダを作る目的で全ファイル除外したコマンドは、
生成結果の空フォルダ作成を無視して仕舞います。
コマンドアウトプット(経過報告)は 如何にも成功 なのですが、
echo %errorlevel% を続けて実行すれば Return Code 9009 が返されます。
成功時の 0 / 1 / 2 等ではありませんね。

 9009 を検索して見ると
 ありえないコマンドを実行しようとした場合は errorlevel に 9009 が入る

との事。
そう、矛盾したオプションの組み合わせから、こうした戻り値が返っているのでしょうか。

ですから、
/S では無く、 /E を指定してあげれば OK ! です。

Robocopy SourceDir ExtensionDir /E /Dcopy:T /XF *.*


何時から、この様な仕様に変更されていたか? は不明ですが、
相当前であった様な気もします。
実際に利用する機会は少ないので、すっかり、見落としていました。
見た目、成功しているのに、コピーされていない ... 。
これは 精神衛生上 宜しく無い! ですから、
お気を付け下さいませ。
 
  何だか、
  大昔の SF 映画 の名作 2001年宇宙の旅 2001: A Space Odyssey の Computer : HAL を思い出しました。
  そう、 搭乗員 を危機に陥れる あれ です。
  その種明かしは ... 。
  続編 2010年宇宙の旅 2010: Odyssey Two (The Year We Make Contact) で明らかにされていましたね。
  私のやっていた事は ... これと同じ ... 。

  命令の矛盾!。

  私の以前の投稿は、搭乗前 HAL9000 にやった仕打ち(設定)と、ある意味、一緒だった訳で ... 。  X(


参考迄に、試行錯誤の経緯を。
19041.572 、そう、Version 2004 上で。
おや、 Version 20H2 で出ていた Return Code 9009 が 出ませんねぇえ。

Microsoft Windows [Version 10.0.19041.572]
(c) 2020 Microsoft Corporation. All rights reserved.

C:¥WINDOWS¥system32>tree H:¥TestRobocopy /F
フォルダー パスの一覧:  ボリューム Luxe_64G_1
ボリューム シリアル番号は 0123-ABCD です
H:¥TESTROBOCOPY
└─Sub1
    ├─Sub1a
    │      text1a.txt
    │
    └─Sub1b

C:¥WINDOWS¥system32>Robocopy  h:¥TestRobocopy  h:¥TestRobocopy2 /S /Dcopy:T /XF:*.*

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------

  開始: 2020年10月
   コピー元 - h:¥TestRobocopy¥
     コピー先 - h:¥TestRobocopy2¥

    ファイル:
  オプション: /S /DCOPY:T /COPY:DAT /R:1000000 /W:30

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

エラー: 無効なパラメーター #5 : "/XF:*.*"

       簡易な使用法 :: ROBOCOPY コピー元 コピー先 /MIR

           コピー元 :: コピー元ディレクトリ (ドライブ:¥パスまたは ¥¥サーバー
                       ¥共有¥パス)。
           コピー先 :: コピー先ディレクトリ (ドライブ:¥パスまたは ¥¥サーバー
                       ¥¥共有¥パス)。
               /MIR :: 完全なディレクトリ ツリーをミラー化します。

    詳細な使用方法については、ROBOCOPY /? を実行してください。


****  /MIR はファイルをコピーできるだけでなく、削除もできます。

C:¥WINDOWS¥system32>Robocopy  h:¥TestRobocopy  h:¥TestRobocopy2 /S /Dcopy:T /XF *.*

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------

  開始: 2020年10月
   コピー元 : h:¥TestRobocopy¥
     コピー先 : h:¥TestRobocopy2¥

    ファイル: *.*

除外ファイル: *.*

  オプション: *.* /S /DCOPY:T /COPY:DAT /R:1000000 /W:30

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

        新しいディレクトリ       0      h:¥TestRobocopy¥
        新しいディレクトリ       0      h:¥TestRobocopy¥Sub1¥
        新しいディレクトリ       1      h:¥TestRobocopy¥Sub1¥Sub1a¥
        新しいディレクトリ       0      h:¥TestRobocopy¥Sub1¥Sub1b¥

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

                  合計     コピー済み      スキップ       不一致        失敗    Extras
   ディレクトリ:         4         4         0         0         0         0
     ファイル:         1         0         1         0         0         0
      バイト:         1         0         1         0         0         0
       時刻:   0:00:00   0:00:00                       0:00:00   0:00:00
   終了: 2020年10月


C:¥WINDOWS¥system32>echo %errorlevel%
0

C:¥WINDOWS¥system32>tree H:¥TestRobocopy2 /F
フォルダー パスの一覧:  ボリューム Luxe_64G_1
ボリューム シリアル番号は 0123-ABCD です
H:¥TESTROBOCOPY2
サブフォルダーは存在しません

C:¥WINDOWS¥system32>rem Results ; Copy Only Root (h:¥TestRobocopy2)
C:¥WINDOWS¥system32>rem Delete h:¥TestRobocopy2

C:¥WINDOWS¥system32>Robocopy  h:¥TestRobocopy  h:¥TestRobocopy2 /E /Dcopy:T /XF *.*

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------

  開始: 2020年10月
   コピー元 : h:¥TestRobocopy¥
     コピー先 : h:¥TestRobocopy2¥

    ファイル: *.*

除外ファイル: *.*

  オプション: *.* /S /E /DCOPY:T /COPY:DAT /R:1000000 /W:30

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

        新しいディレクトリ       0      h:¥TestRobocopy¥
        新しいディレクトリ       0      h:¥TestRobocopy¥Sub1¥
        新しいディレクトリ       1      h:¥TestRobocopy¥Sub1¥Sub1a¥
        新しいディレクトリ       0      h:¥TestRobocopy¥Sub1¥Sub1b¥

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

                  合計     コピー済み      スキップ       不一致        失敗    Extras
   ディレクトリ:         4         4         0         0         0         0
     ファイル:         1         0         1         0         0         0
      バイト:         1         0         1         0         0         0
       時刻:   0:00:00   0:00:00                       0:00:00   0:00:00
   終了: 2020年10月


C:¥WINDOWS¥system32>echo %errorlevel%
0

C:¥WINDOWS¥system32> C:¥WINDOWS¥system32>rem Results ; Copy All Include Empty Sub Directories

C:¥WINDOWS¥system32>tree H:¥TestRobocopy2 /F
フォルダー パスの一覧:  ボリューム Luxe_64G_1
ボリューム シリアル番号は 0123-ABCD です
H:¥TESTROBOCOPY2
└─Sub1
    ├─Sub1a
    └─Sub1b

C:¥WINDOWS¥system32>
.



0 件のコメント:

コメントを投稿