0

아래 기능은 디렉터리 구조를 평평하게 만들고 선택한 마지막 쓰기 날짜를 기반으로 파일을 복사합니다.PowerShell Flatten Directory 구조체

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 콘솔 창에 하나의 파일이 복사되거나 아무 것도 나타나지 않습니다. 이 특별한 경우에는 약 2 천 7 백만 개의 파일이있었습니다.

그러나 단순한 배치 파일은 매우 느리지 만 아무런 문제없이 작업을 수행했습니다.

여기에 도움을 주시면 감사하겠습니다.

+1

중간 변수를 사용하지 마십시오 : http://stackoverflow.com/a/39657987/3959875 – wOxxOm

+1

이것은 robocopy가 더 적합 할 수 있으며 wOxxOm이 말한 것처럼 변수에 파일을 저장하지 말라고합니다. 파이프 라인을 사용하십시오. PowerShell 3.0 이상인 경우 Get-Childitem의 -File 스위치를 사용할 수도 있습니다. – Matt

+0

니스. 두 분 모두 나에게 관련있는 정보를 제공해 주셨고이 방법으로 많은 양의 데이터를 이동하는 데 걸리는 시간을 줄이는 것처럼 보였습니다. 정말 고맙습니다. – GreatMagusKyros

답변

0

간단한 대답은 다음과 같습니다. 중간 변수를 사용하면 파일 이동이 시작될 때 막대한 지연이 발생합니다. 커플이 단순히 -file 스위치를 사용하여 반대하고, 대답이 결과 내 스크립트에 몇 가지 간단한 수정했다으로

-and $_.PSIsContainer -eq $false 

를 사용하여 다음

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 
} 
}