0

下面的函數根據所選的最後寫入日期來平整目錄結構並複製文件。PowerShell Flatten目錄結構

function mega-copy($srcdir,$destdir,$startdate,$enddate) 
{ 
$files = Get-ChildItem $SrcDir -recurse | Where-Object { $_.LastWriteTime -ge "$startdate" -and $_.LastWriteTime -le "$enddate" -and $_.PSIsContainer -eq $false }; 
$files|foreach($_) { 
       cp $_.Fullname ($destdir+$_.name) -Verbose 
} 
} 

這是非常成功的小目錄,但嘗試使用它與多個子目錄和文件目錄時的計數範圍從幾十萬到幾千萬,它只是個攤位。我運行它並允許它靜置24小時,並且沒有複製單個文件,也沒有任何內容顯示在PowerShell控制檯窗口中。在這個特定的例子中,大約有2700萬個文件。

然而,一個簡單的批處理文件沒有任何問題完成了這項工作,儘管它非常慢。

我很感謝這裏的任何幫助。

+1

不要使用中間變量: http://stackoverflow.com/a/39657987/3959875 – wOxxOm

+1

這是robocopy可能更適合和喜歡wOxxOm說不要將文件保存在變量中的東西。使用管道。如果你至少有PowerShell 3.0,你也可以使用Get-Childitem的'-File'開關。 – Matt

+0

不錯。你們兩個都向我提供了相關的信息,似乎減少了用這種方法移動大量數據所需的時間。非常感謝。 – GreatMagusKyros

回答

0

簡單的答案是這樣的:使用中間變量導致文件移動啓動的巨大延遲。夫婦,與使用

-and $_.PSIsContainer -eq $false 

而不是簡單地使用-file開關,答案是幾個簡單的修改我的腳本導致此:

function mega-copy($srcdir,$destdir,$startdate,$enddate) 
{ 
Get-ChildItem $SrcDir -recurse -File | Where-Object { $_.LastWriteTime -ge "$startdate" -and $_.LastWriteTime -le "$enddate" } | foreach($_) { 
       cp $_.Fullname ($destdir+$_.name) -Verbose 
} 
}