robocopy / mirがフォルダー構造を複製していません


0

次のスクリプトを使用して、2013年1月1日より前にすべてをアーカイブしています。

foreach  ($i in Get-ChildItem "O:\Projects” -Force -Recurse)
{
    if ($i.LastWriteTime -gt ($(Get-Date).AddDays(-649)))
    {
          robocopy $i.FullName "A:\Operations\Projects" /Z /S /MOVE /MIR
    }
}

問題は、スクリプトが正確なディレクトリツリーをコピーしていないことです。適切なファイルを含むフォルダをターゲットディレクトリのルートにコピーするだけです。

例として、これはフォルダー構造を表します。

  • プロジェクトA
    • 見積もり
      • QuoteA.pdf(最終更新2011年6月)
    • 見切り
      • CloseoutA.pdf(最終変更日2011年11月)
  • プロジェクトB
    • 見積もり
      • QuoteB.pdf(最終変更日2012年10月)
    • 見切り
      • CloseoutB.pdf(最終変更日2013年4月)

上記のスクリプトでは、次のターゲットフォルダが作成されます。

  • 見積もり
    • QuoteA.pdf
    • QuoteB.pdf
  • 見切り
    • CloseoutA.pdf

上記の例は非常に基本的なものです。一部のファイルは、8または9フォルダーの深さです。ソースディレクトリ内には約30,000個のフォルダーがあります。移動中に適切なファイルの完全なパスをそのままにしておく必要がありますが、どうすればそれを実現できますか?

回答:


0

以下のコメントから編集します。

ツリー内のファイルを移動する必要があるかどうかをrobocopyに決定させ、Get-Childitemを使用しないようにすることができます。

robocopy "O:\Projects" "A:\Operations\Projects" /Z /S /MOVE /MIR /MINAGE:649

$ i.FullNameを使用していましたが、$ i.DirectoryNameは関係ありませんでした。すべてのファイルをサブディレクトリなしでターゲットディレクトリのルートに置くだけでした。何らかの理由で「エラー2(0x00000002)ソースディレクトリへのアクセス」と表示されています。ターゲットドライブ全体で「全員」のアクセス許可がfullに設定されています。ソースディレクトリへのアクセス中にエラーが発生する理由はわかりません。また、-gtまたは-ltを使用して、指定された時間よりも古いオブジェクトを選択する場合、少し混乱します。
jchap1590 14年

日付については、($ i.LastWriteTime -gt($(Get-Date).AddDays(-649)、つまり$ i.LastWriteTimeが649日前よりも新しいことを意味します。古い場合は-を使用しますLT。
ミッキーBalladelli

Get-ChildItemはRobocopyを混乱させると思います。ご覧のとおり、まずディレクトリツリーを取得し、次にそのツリーに/ MIRと/ MOVEをロボコピーに依頼すると、Foreachはツリー内の次のアイテムにアクセスしますが、前の繰り返しで既に移動されています。
ミッキーバラデリ14年

powershellを介して実行せずにrobocopyコマンドを試してみますが、robocopy自体を再帰的にする方法はないと読んでいたので、powershellを介して実行する理由があります。
jchap1590 14年

コマンドは私がしたいことをしているようです!編集:気にしない、私はそれを得た。本当にありがとう!
jchap1590 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.