9

使用 PowerShell 4.0,我试图获取多个目录的大小,并且在 windows 告诉我的内容和我的代码告诉我的内容之间得到了非常不一致的结果。

有问题的代码是:

$temp4 = ($folderInfo.rootFolder).fullname
$folderInfo.directories += Get-ChildItem -LiteralPath $temp4 -Recurse -Force -Directory
$folderInfo.directories += $folderInfo.rootFolder
foreach ($dir in $folderInfo.directories)
{
    $temp3 = $dir.fullname
    $temp2 = Get-ChildItem -LiteralPath $temp3 -Force
    $temp = (Get-ChildItem -LiteralPath $dir.fullname -Force -File | Measure-Object -Property length -Sum -ErrorAction SilentlyContinue).Sum
    $folderInfo.totalSize += $temp
}
return $folderInfo

如果$folderInfo.rootFolder = D:\sample 那时我得到了我想要的但如果$folderInfo.rootFolder = D:\[sample 那时我得到了

Get-ChildItem :无法检索 cmdlet 的动态参数。指定的通配符模式无效:sample [sample At C:\powershell scripts\test.ps1:55 char:12 + $temp = (Get-ChildItem $dir.fullname -Force -File | Measure-Object -Property l ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: ( :) [Get-ChildItem],ParameterBindingException + FullyQualifiedErrorId:GetDynamicParametersException,Microsoft.PowerShell.Commands.GetChildItemCommand

D:\sample如果在其子项中的某个位置包含一个文件夹,则同样适用"[sample"。我将从其他所有内容中获得正确的结果,但问题目录中或之外的任何内容。两者都$dir.pspath搞砸$dir.fullname了。

编辑:更改了上面的代码以反映它的当前状态并包含完整的错误。
再次编辑:上面的代码现在有一些调试临时变量。

4

1 回答 1

17

使用-LiteralPath参数代替-Path来抑制通配符通配符。此外,由于您使用的是 V4,因此您可以使用-Directory开关并省去过$_.iscontainer滤器:

$folderInfo.directories = 
 Get-ChildItem -LiteralPath $folderInfo.rootFolder -Recurse -Force -Directory 

如果在目录树的下方有更多方括号,请在后续的 Get-ChildItem 命令中继续使用 literpath:

$folderInfo.directories += Get-ChildItem -LiteralPath $folderInfo.rootFolder -Recurse -Force -Directory
    $folderInfo.directories += Get-Item -LiteralPath $folderInfo.rootFolder
    foreach ($dir in $folderInfo.directories)
    {
        $temp2 = Get-ChildItem -LiteralPath $dir.PSPath -Force
        $temp = (Get-ChildItem -LiteralPath $dir.fullname -Force -File | Measure-Object -Property length -Sum -ErrorAction SilentlyContinue).Sum
        $folderInfo.totalSize += $temp
    }
    return $folderInfo
于 2014-02-06T21:22:00.393 回答