2016-04-11 9 views
0

OK、フォルダと内容を日付に基づいてUNCパス(共有ドライブ)から別のUNCパス(NAS)にコピーしようとしています(2015年1月1日前)。はい、私はコードが2017と言うことを知っていますが、テストで作業したら、日付を変更してprodで実行します。Powershellでフォルダとコンテンツを移動します。

#Original file path 
$path = "UNC Path" 
#Destination file path 
$destination = "Different UNC Path" 
#It makes a filelist of what's inside the $path path 
Foreach($file in (Get-ChildItem $path)) { 
#If the lastwrite time is before the given date 
If($file.LastWriteTime -lt "01/01/2017") { 
#It copies the file to the destination 
Copy-Item -Path $file.fullname -Destination $destination -Force } } 

フォルダの内容は正常にコピーされますが、フォルダはコピーされません。私は〜が間に合わないと思っていますが、Get-ChildItem $パスの後に置くと動作しませんでした。

私はこの作業をし、次にRemove-Item行を追加して、ファイルサーバーからすべての古い項目を削除する予定です。

思考?これを達成するためのより良い方法の提案?

おかげで、

+1

ちょうど開始が、二つのことだrobocopyを –

答えて

0

私はあなただけGet-ChildItemから-Recurseが欠けていると思うが、私はそうのようにそれを行うだろう:あなたがコピーする隠しファイルまたはシステムファイルを持っていれば

Get-ChildItem -Path $Path -Recurse ` 
| Where-Object { $_.LastWriteTime -lt '2017-01-01' } ` 
| ForEach-Object { 
    Copy-Item -Path $_.FullName -Destination ($_.FullName.Replace($source,$destination)) -Force; 
} 

、あなたGet-ChildItem-Forceパラメータも設定します。

実は、あなたはこれを行うために必要がある場合があります。それは、ファイル構造を平坦化だと長すぎるファイル名のカップルがあります:

Get-ChildItem -Path $Path -Recurse ` 
| Where-Object { $_.LastWriteTime -lt '2017-01-01' } ` 
| ForEach-Object { 
    if ($_.PSIsContainer -and !(Test-Path($_.FullName.Replace($source,$destination)) { 
     mkdir ($_.FullName.Replace($source,$destination)); 
    } 
    else { 
     Copy-Item -Path $_.FullName -Destination ($_.FullName.Replace($source,$destination)) -Force; 
    } 
} 
+0

を呼び出します。私が気にしていないファイル名は、フォルダ構造を平坦化しないでください。 – tkiuntke

+0

@tkiuntkeああ、もちろん。私はその部分を忘れてしまった!私の修正されたコードを見てください。長い限り、あなたは他のツールを使わなければなりません。 PowerShellはC#に基づいており、C#は.Net Frameworkに限定されており、WinAPIで許可されている長いパス名のもの(つまり、\\?\ .... ')は使用しません。 Robocopyまたは長いパス名をサポートする同様のツールを使用する必要があります。 –

+0

@tkiuntkeあなたがUNCパスを使用している場合は、それがエラーを投げているのに少し驚いています。私はそれらが働いたと思った。 –

関連する問題