Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 将管道参数绑定到函数参数时出现Null错误_Powershell_Cmd - Fatal编程技术网

Powershell 将管道参数绑定到函数参数时出现Null错误

Powershell 将管道参数绑定到函数参数时出现Null错误,powershell,cmd,Powershell,Cmd,我正在尝试创建一个Powershell函数,该函数接受管道字符串(来自ExpandProperty) 由于某种原因,我一直得到一个空错误(附在下面), 但是如果我在没有最后一个管道命令的情况下运行代码,它就可以正常工作。我也尝试过将Get-ChildItem管道包装到数组(@)中,但没有用 错误代码 代码 既然你在学习,我可以指出一些事情。实际上,如果您使用高级参数和[cmdletbinding()],您需要开始{},处理{}&结束{}块。对于通过管道传递的每个对象,进程块将运行一次 在Po

我正在尝试创建一个Powershell函数,该函数接受管道字符串(来自ExpandProperty)

由于某种原因,我一直得到一个空错误(附在下面), 但是如果我在没有最后一个管道命令的情况下运行代码,它就可以正常工作。我也尝试过将Get-ChildItem管道包装到数组(@)中,但没有用


错误代码
代码
既然你在学习,我可以指出一些事情。实际上,如果您使用高级参数和
[cmdletbinding()]
,您需要
开始{}
处理{}
&
结束{}
块。对于通过管道传递的每个对象,进程块将运行一次

在PowerShell中,您还可以更轻松地完成许多事情:

Function Get-FolderSize {

    [cmdletbinding()]
    Param ( 
        [Parameter( Mandatory = $true, Position = 0, ValueFromPipeline )]
        [String[]]$FolderPath
    ) # End Param Block
    
    Begin{}

    Process
    {
        [UInt64](Get-ChildItem $FolderPath -Recurse -File |
        Measure-Object -Property Length -Sum).Sum
    } # End Process Block
    
    End{}
} # End Function Get-FolderSize
  • 您实际上不需要为FolderPath参数抛出错误。你已经强制执行了。如果未指定,函数将提示输入
  • 添加
    valuefrompipline
    参数属性、
    Begin{}
    Process{}
    &
    End{}
    块以启用管道输入
  • 我不确定转换路径在那里做了什么,看起来没有必要
  • -File
    开关参数与
    Get ChildItem
    一起使用,以递归方式列出所有文件,而无需对
    .PSIsContainer
    执行逻辑
  • 使用
    Measure Object
    为发射其sum属性的文件大小求和。注意,您不需要将其分配给变量,也不需要使用return语句。从函数发出的任何内容都将返回给调用方
注意:我还返回了转换为
[UInt64]
数字类型的值。这有助于将null返回值翻转为零,而不允许使用非常大的数字

我还将
-FolderPath
参数转换为字符串数组(
[string[]]
)。我不确定您的意图是否真的是允许多个对象沿着管道向下,但如果您这样做,它将为您提供的每个路径返回一个总和。无论如何,这就是我如何启动这样一个函数的方法

我不确定你用剩下的代码做了什么,我看不出你在哪里调用这个函数。然而,我感觉你想要列出文件夹的大小。使用上面的函数,可能看起来像:

Get-ChildItem c:\temp -Directory | 
Select-Object *,@{Name = 'FolderSize'; Expression = { Get-FolderSize $_.FullName }} | 
Format-Table FullName,FolderSize -Wrap

显然,编写高级函数还有很多。阅读材料并不短缺,只要用谷歌搜索它…

为了让函数从管道接收对象,必须至少设置一个参数以允许管道中的值。您还需要一个进程{}块。请仔细阅读-因为在现有答案中没有特别提到,您不需要使用
PSIsContainer
,即
ls$folderpath-file-recurse
gci$dirpath-file-recurse
,除非您的脚本需要在v3.0之前的PowerShell版本上运行。
Function Get-FolderSize {

    [cmdletbinding()]
    Param ( 
        [Parameter( Mandatory = $true, Position = 0, ValueFromPipeline )]
        [String[]]$FolderPath
    ) # End Param Block
    
    Begin{}

    Process
    {
        [UInt64](Get-ChildItem $FolderPath -Recurse -File |
        Measure-Object -Property Length -Sum).Sum
    } # End Process Block
    
    End{}
} # End Function Get-FolderSize
Get-ChildItem c:\temp -Directory | 
Select-Object *,@{Name = 'FolderSize'; Expression = { Get-FolderSize $_.FullName }} | 
Format-Table FullName,FolderSize -Wrap