如果PowerShell中的Get-ChildItem语句有什么问题?

时间:2009-02-26 07:29:20

标签: powershell

我无法使用以下PowerShell语句。目标是获取..\archive文件夹中按最旧排序的文件夹列表。

我想将$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\" }}

我可能做错了什么?我没有得到任何错误。当我执行它时,它就会停下来并挂起。

2 个答案:

答案 0 :(得分:1)

试试这个。这是一个很长的单行(删除-whatIf来执行移动):

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

答案 1 :(得分:0)

我不太清楚我理解。但我认为您希望将\archive中的文件夹移至\archive\movetotape以填充\movetotape,直至其大小为$ClosedJobsSize或更小。正确?

以下几点:您在\archive中添加了所有内容的大小,因此您的比较结果将永远不会改变。其次,检查的其中一个文件夹本身是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
}