2015-01-08 6 views
1

폴더와 파일을 특정 위치에서 x 일이 지난 다른 위치로 이동하지만 일부 폴더는 제외되도록하는 powershell 스크립트가 필요합니다.폴더와 파일을 특정 위치에서 다른 위치로 옮기는 스크립트가 필요합니다.

또한 이동 한 파일 및 폴더 목록을 전자 메일로 보낼 수 있어야합니다.

폴더에서 파일을 이동할 수 있지만 전체 폴더를 이동하는 방법을 모르겠습니다. 여기

내가 지금까지 함께 넣어 가지고 몇 가지 코드입니다, 어떤 제안은

Set-ExecutionPolicy RemoteSigned 

#----- define parameters -----# 
#----- get current date ----# 
$Now = Get-Date 
#----- define amount of days ----# 
$Days = "7" 
#----- define folder where files are located ----# 
$TargetFolder = "C:\test" 
$TargetPath = "C:\test5" 

#----- define extension ----# 
$Extension = "*.*" 
#----- define LastWriteTime parameter based on $Days ---# 
$LastWrite = $Now.AddDays(-$Days) 

#----Exclusion List ----# 
$exclude [email protected]('test1', 'test2') 


#----- get files based on lastwrite filter and specified folder ---# 
$Files = Get-Childitem -path $TargetFolder -Include $Extension -Recurse | Where {$_.LastWriteTime  -le "$LastWrite"} -and $_Name -ne $exclude | foreach ($_)} #- 


foreach ($File in $Files) 
    { 
    if ($File -ne $NULL) 
     { 
     write-host "Deleting File $File" -ForegroundColor "DarkRed" 
     Move-Item $File.FullName $TargetPath -force 
     } 
    else 
     { 
     Write-Host "No more files to delete!" -foregroundcolor "Green" 
     } 
    } 
+0

당신이 파일을 기반으로 디렉토리를 선택하는 시간을 lastwrite되거나 약간의 정규식을 사용하여이 작업을 수행 할 수있는 부분 이름이 포함 된 경우 내용에 관계없이 폴더 자체의 lastwritetime을 볼 필요가 있습니까? – Matt

+0

내용에 관계없이 폴더의 lastwritetime 자체가 실제로 바람직합니다. – user4432997

답변

0

PowerShell을 v3의 이상에서 지원되는 축약 버전 좋은 것입니다. 그러면 LastWriteTime 폴더가 7 일 이상 오래된 모든 폴더를 찾아 이동할 수 있습니다.

$LastWrite = (Get-Date).AddDays(-7) 
gci c:\temp -Directory -Recurse | ?{$_.LastWriteTime -le $LastWrite} | select -expand fullname | %{Move-Item $_ $TargetPath} 

논리가 생략되도록 폴더 시간 만보고 있다면 파일 제외에 아무런 의미가 없습니다. 같은 코드를하지만, 쉽게 읽을 :

$LastWrite = (Get-Date).AddDays(-7) 
Get-ChildItem $TargetFolder | Where-Object{$_.LastWriteTime -le $LastWrite} | Select-Object -ExpandProperty FullName | ForEach-Object{ 
    Move-Item $_ $TargetPath 
} 

주의 할

이 폴더를 이동하려고하고 부모가 이전에 이동했을 수 있습니다 문제가 될 수 있습니다. 지금 바로 테스트 환경을 확인하지 마십시오. 혹시 복사하기 전에 약간의 테스트를 사용할 수 있습니다. 이메일 작업을위한

If(Test-Path $_){Move-Item $_ $TargetPath} 

이메일

출발점 Send-MailMessage 될 것이다. 다른 방법들도 있습니다. 특정 폴더를 생략하고 싶었다면

폴더 제외

는 그것을 달성하기 위해 몇 가지 방법이있다. 생략하려는 전체 폴더 이름을 알고있는 경우 $exclude [email protected]('test1', 'test2')과 같이 추가하고 Where 절을 변경할 수 있습니다.

Where-Object{$_.LastWriteTime -le $LastWrite -and $exclude -notcontains $_.Name} 

당신은 전체 이름을 몰랐어요 어쩌면 그 $exclude 단지뿐만 아니라

$exclude [email protected]('test1', 'test2') 
$exclude = "({0})" -f ($exclude -join "|") 

#..... other stuff happens 

Where-Object{$_.LastWriteTime -le $LastWrite -and $_.Name -notmatch $exclude} 
+0

감사합니다. 파일 자체가 아닌 특정 폴더에 대해 예외를 추가하는 방법은 무엇입니까? 예를 들어 내가 갖고 싶은 하위 폴더가 20 개 있고 20 개 이상 이동하려는 폴더가 있다고 가정 해 봅시다. 이동하지 않으려는 폴더의 예외 목록을 어떻게 추가합니까? – user4432997

+0

@ user4432997 업데이트보기 – Matt

+0

폴더가 대상에 이미있는 경우. 그것을 덮어 씌울 수있는 방법이있다. 현재 파일이 이미 존재할 때 파일을 만들 수없는 대상과 함께 이미 존재하면 실패합니다.If (Test-Path $ _) {Move-Item $ _ $ TargetPath} 테스트를 포함하고 있음을 압니다.하지만 그것이 존재한다고해도 나는 그것을 앞뒤로 덮어 쓰고 싶습니다. – user4432997