2009-02-26 4 views
0

次のPowerShellステートメントを使用するには問題があります。目的は、..\archiveフォルダーにあるフォルダーのリストを古いものから順番に並べ替えることです。PowerShellのGet-ChildItemステートメントで何が問題になっていますか?

$ClosedJobssize以下のフォルダの数を..\Archiveから..\movetotapeにコピーしたいと思います。これは、\ Archiveフォルダのサイズがハードドライブ上で変わることはありません。

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

何が間違っていますか?私は何の誤りもありません。私はそれを実行するときに座ってハングします。

+0

'(取得-ChildItemコマンドレット-path "\\ srv02 \ dの$の\プリプレス\アーカイブを" -recurse -force |対策・オブジェクトは、-Property長-Sum).Sum'はあなたを含めた合計サイズを取得しますアーカイブディレクトリ内のすべてのファイルのサブフォルダ。私は、比較のために現在のパイプラインオブジェクトの長さを追加することで、あなたが達成しようとしていることを理解していません。それはまた高価で、それにパイプされたすべてのオブジェクトのためにそれをしています... 次に、 'move-item-destination '\\ srv02 \ d $ \ prepress \ archive \ MoveToTape \" 'はソースはありません。したがって、何もしません。 – Jimmeh

答えて

1

これを試してください。

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

1つのライナーが私のために働かなかった。すべてをmovetotapeフォルダにコピーしました – phill

0

私は理解してかなりわからない:それは長いワンライナー(移動を実行するために-whatIfを削除します)です。しかし、のフォルダを\archive\movetotapeに移動して、またはそれ以下のサイズになるまで\movetotapeを埋めたいと思っています。右?

いくつかのこと:すべてのサイズを\archiveに追加しているため、比較の結果は決して変更されません。第2に、チェックされたフォルダの1つがMoveToTapeであるため、それを自分自身に移動させる可能性があります(例外があります)。

このコードはうまくいくと思いますが、テストしていません。

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

目的はファイルを同じフォルダの別のフォルダに移動することです。したがって、1ギガバイトのデータがclosedjobsフォルダから来てアーカイブに置かれた場合、最も古いファイルのうち1ギガバイトがアーカイブから出て、movetotapeフォルダに移動する必要があります。ありがとう! – phill

+0

次に、私のコードがそうすると思います。 \ movetotapeは、\ movetotapeが$ ClosedJobsSizeのデータ量でいっぱいになるまで\ archiveからのフォルダでいっぱいになります(または移動するものが不足します)。テストをして、必要なものかどうか教えてください。 – JasonMArcher

+0

$ closedJobsSizeはどこで計算されていますか?行がありませんか? – phill

関連する問題