我无法使用以下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\" }}
我可能做错了什么?我没有得到任何错误。当我执行它时,它就会停下来并挂起。
答案 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
}