Powershell 将管道参数绑定到函数参数时出现Null错误
我正在尝试创建一个Powershell函数,该函数接受管道字符串(来自ExpandProperty) 由于某种原因,我一直得到一个空错误(附在下面), 但是如果我在没有最后一个管道命令的情况下运行代码,它就可以正常工作。我也尝试过将Get-ChildItem管道包装到数组(@)中,但没有用Powershell 将管道参数绑定到函数参数时出现Null错误,powershell,cmd,Powershell,Cmd,我正在尝试创建一个Powershell函数,该函数接受管道字符串(来自ExpandProperty) 由于某种原因,我一直得到一个空错误(附在下面), 但是如果我在没有最后一个管道命令的情况下运行代码,它就可以正常工作。我也尝试过将Get-ChildItem管道包装到数组(@)中,但没有用 错误代码 代码 既然你在学习,我可以指出一些事情。实际上,如果您使用高级参数和[cmdletbinding()],您需要开始{},处理{}&结束{}块。对于通过管道传递的每个对象,进程块将运行一次 在Po
错误代码
代码
既然你在学习,我可以指出一些事情。实际上,如果您使用高级参数和
[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
- 使用
为发射其sum属性的文件大小求和。注意,您不需要将其分配给变量,也不需要使用return语句。从函数发出的任何内容都将返回给调用方Measure Object
[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