2009-02-26 14 views
0

Çalışmak için aşağıdaki PowerShell ifadesini almada sorun yaşıyorum. Amaç, en eskiden en küçüğe göre sıralanan ..\archive klasöründeki klasörlerin bir listesini elde etmektir.PowerShell'de Get-ChildItem ifadesi varsa bunun nesi yanlış?

$ClosedJobssize numaralı veya daha küçük olan klasörlerin sayısını ..\Archive'dan ..\movetotape klasörüne kopyalamak istiyorum. Bu yüzden .. \ Arşiv klasörünün boyutu sabit diskte hiçbir zaman değişmez.

get-childitem -path "\\srv02\d$\Prepress\Archive" | sort-object -property 

@{Expression={$_.CreationTime};Ascending=$false} | % { if (((get-childitem -path 

"\\srv02\d$\prepress\archive" -recurse -force | measure-object -Property Length -Sum).Sum + $_.Length) 

-lt $closedjobssize) { move-item -destination "\\srv02\d$\prepress\archive\MoveToTape\" }} 

Neyi yanlış yapıyorum? Ben hiç hata alamıyorum. Sadece oturduğunda ve oturduğunda kilitleniyor.

+0

'(get-childitem -Path "\\ srv02 \ d $ \ baskı öncesi \ arşivi" -recurse -force | tedbir-nesne -Emlak Uzunluk -sum) .Sum' size dahil toplam büyüklüğü, alacak arşiv dizinindeki tüm dosyaların alt klasörleri. Mevcut boru hattı nesnesinin uzunluğunu karşılaştırmaya ekleyerek elde etmeye çalıştığınız şeyi anlamıyorum. Aynı zamanda pahalı, ve ona iletilen her nesne için yapıyorsun ... Sonra, 'move-item -destination' \\ srv02 \ d $ \ prepress \ archive \ MoveToTape \ "' bir kaynak ve dolayısıyla hiçbir şey yapmaz (eğer senaryo şimdiye kadar bu kadar uzağa ulaştıysa sizi bir kaynak için yönlendirir). – Jimmeh

cevap

1

Bunu deneyin.

dir "\\srv02\d$\Prepress\Archive" | sort CreationTime -desc | where { $_.psiscontainer -AND (dir $_.fullname -recurse -force | measure-object -Property Length -Sum).Sum -lt $closedjobssize} | Move-Item -dest "\\srv02\d$\prepress\archive\MoveToTape\" -whatIf 
+0

bir liner benim için çalışmadı. Sadece her şey movetotape klasörüne kopyalandı – phill

0

Anladığımdan pek emin değilim: Bu uzun bir liner (hamleyi gerçekleştirmek için -whatIf kaldırmak) bulunuyor. Ancak \archive klasörlerini \movetotape numaralı telefona $ClosedJobsSize veya daha az boyutta olana kadar taşımak istediğinizi düşünüyorum. Sağ?

Birkaç şey: \archive'da her şeyin boyutunu ekliyorsunuz, böylece karşılaştırmanızın sonucu hiçbir zaman değişmeyecek. İkincisi, kontrol edilen klasörlerden biri MoveToTape kendisidir, bu da kendi içine taşımanıza neden olabilir (bu bir istisna vermelidir).

Bunu göz önünde bulundurarak, bu kodun çalışacağını düşünüyorum, ancak test etmedim.

## Get all the directories in \arcive that need to be moved 
$Directories = Get-ChildItem "\\srv02\d$\Prepress\Archive" | 
    Where-Object {$_.PSIsContainer -and ($_.Name -ne "MoveToTape")} | Sort-Object CreationTime -Descending 
foreach ($Directory in $Directories) 
{ 
    $SumOfMoveToTape = (Get-ChildItem "\\srv02\d$\prepress\archive\MoveToTape\" -Recurse | Measure-Object -Property Length -Sum).Sum 
    $SumOfItem = (Get-ChildItem $_.FullName -Recurse | Measure-Object -Property Length -Sum).Sum 
    if(($SumOfMoveToTape + $SumOfItem) -lt $ClosedJobsSize) 
    { 
     ## If we can fit on MoveToTape, then move this directory 
     Move-Item -Destination "\\srv02\d$\prepress\archive\MoveToTape\" 
    } 
    ## If you want to keep folders in order (and not try to squeze whatever onto the tape 
    ## then put an 'else {break}' here 
} 
+0

Amaç, dosyaları bir klasörden diğerine aynı boyutta kaydırmaktır. Bu yüzden kapalı veri klasöründen 1 adet veri gelip arşive yerleştirildiyse, en eski dosyaların 1 gb'si arşive klasörden gitmek için arşivden çıkmalıdır. Teşekkürler! – phill

+0

O zaman kodum bunu yapacak. \ Arşivden \ movetotape klasörleri ile doldurarak \ $ kapsayıcı $ doJBobsSize veri miktarı ile dolduracaktır (veya taşınacak şeyler tükendi). Bir test verin ve ihtiyacınız olan şey olup olmadığını bana bildirin. – JasonMArcher

+0

$ closedJobsSize değerini nereden hesaplıyor? eksik bir hat var mı – phill

İlgili konular