“[”和“]”字符弄乱了get-childitem

时间:2014-02-06 21:03:35

标签: powershell directory get-childitem

使用PowerShell 4.0, 我试图获得多个目录的大小,我得到的窗口告诉我和我的代码告诉我的结果非常不一致。

有问题的代码是:

$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   在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都搞砸了。

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

1 个答案:

答案 0 :(得分:14)

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

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

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

$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