管道输入时,PowerShell输入到功能不工作

管道输入时,PowerShell输入到功能不工作,powershell,Powershell,我继承了一个powershell函数。当不使用输入或提供单个服务器名称作为输入时,它可以正常工作 函数在这样运行时工作 获取DiskUtil或 Get-DiskUtil computername 但是如果我尝试 Get Content c:\psfiles\servers.txt | Foreach对象{Get DiskUtil}(如果在servers.txt中列出了三台服务器,则会给出本地计算机的三次输出) 或 结果仅给出本地计算机名的输出,并三次显示此错误 有人能告诉我为什么Get Con

我继承了一个powershell函数。当不使用输入或提供单个服务器名称作为输入时,它可以正常工作

函数在这样运行时工作

获取DiskUtil

Get-DiskUtil computername
但是如果我尝试

Get Content c:\psfiles\servers.txt | Foreach对象{Get DiskUtil}
(如果在servers.txt中列出了三台服务器,则会给出本地计算机的三次输出)

结果仅给出本地计算机名的输出,并三次显示此错误

有人能告诉我为什么Get Content不起作用,以及我如何着手解决这个问题吗

computername=$_ : The term 'computername=$_' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a 
path was included, verify that the path is correct and try again.
At D:\Data\WindowsPowerShell\Modules\MyFunctions\Get-DiskUtil.ps1:4 char:10
+ if ($_) {computername=$_}
+          ~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (computername=$_:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
获取DiskUtil:

Function Get-DiskUtil {
Param([string] $computername=$env:computername)
Process {
if ($_) {computername=$_}
gwmi win32_logicaldisk -fi "drivetype=3" -comp $computername |
Select @{Name="Computername";Expression={$_.systemName}},
DevicedID,
@{Name="SizeGB";Expression={"{0:N2}" -f ($_.Size/1GB)}},
@{Name="FreeGB";Expression={"{0:N2}" -f ($_.Freespace/1GB)}},
@{Name="UsedGB";Expression={"{0:N2}" -f (($_.Size-$_.FreeSpace)/1GB)}},
@{Name="PerFreeGB";Expression={"{0:P2}" -f ($_.Freespace/$_.size)}}
}
}

问题是您已经创建了一个函数。函数不接受来自创建高级函数所需的管道的输入

Function Get-DiskUtil {
     [CmdLetBinding]
     Param([parameter(Mandatory=$true,
        ValueFromPipeline=$true)]
          [string] $computername=$env:computername)
     )
这将允许在管道上引入该参数。不,您也可以通过重新设置调用代码来解决此问题

Get-Content c:\psfiles\servers.txt | % {Get-DiskUtil $_}

问题是您已经创建了一个函数。函数不接受来自创建高级函数所需的管道的输入

Function Get-DiskUtil {
     [CmdLetBinding]
     Param([parameter(Mandatory=$true,
        ValueFromPipeline=$true)]
          [string] $computername=$env:computername)
     )
这将允许在管道上引入该参数。不,您也可以通过重新设置调用代码来解决此问题

Get-Content c:\psfiles\servers.txt | % {Get-DiskUtil $_}

您只需将
[参数(ValueFromPipeline=$true)]
属性添加到参数声明中。您还需要将
$ComputerName
参数声明为数组,因为它将接受单个值或值数组

这是修改后的函数

function Get-DiskUtil {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline = $true)]
        [string[]] $ComputerName = $env:COMPUTERNAME
    )

    process {
        Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType = 3" -ComputerName $ComputerName |
        Select-Object -Property @{Name="Computername"; Expression={$_.systemName} },
        DevicedID,
        @{ Name="SizeGB"; Expression={"{0:N2}" -f ($_.Size/1GB)}},
        @{ Name="FreeGB"; Expression={"{0:N2}" -f ($_.Freespace/1GB)}},
        @{ Name="UsedGB"; Expression={"{0:N2}" -f (($_.Size-$_.FreeSpace)/1GB)}},
        @{ Name="PerFreeGB"; Expression={"{0:P2}" -f ($_.Freespace/$_.size)}}
    }
}

# Call the function, passing in an array of values
'localhost','localhost' | Get-DiskUtil

您只需将
[参数(ValueFromPipeline=$true)]
属性添加到参数声明中。您还需要将
$ComputerName
参数声明为数组,因为它将接受单个值或值数组

这是修改后的函数

function Get-DiskUtil {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline = $true)]
        [string[]] $ComputerName = $env:COMPUTERNAME
    )

    process {
        Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType = 3" -ComputerName $ComputerName |
        Select-Object -Property @{Name="Computername"; Expression={$_.systemName} },
        DevicedID,
        @{ Name="SizeGB"; Expression={"{0:N2}" -f ($_.Size/1GB)}},
        @{ Name="FreeGB"; Expression={"{0:N2}" -f ($_.Freespace/1GB)}},
        @{ Name="UsedGB"; Expression={"{0:N2}" -f (($_.Size-$_.FreeSpace)/1GB)}},
        @{ Name="PerFreeGB"; Expression={"{0:P2}" -f ($_.Freespace/$_.size)}}
    }
}

# Call the function, passing in an array of values
'localhost','localhost' | Get-DiskUtil

在我看来,这是个简单的打字错误。 这一行:

if ($_) {computername=$_}
应该是:

if ($_) {$computername=$_}

使用高级函数有很多优点,但不需要具有接受管道输入的函数

在我看来就像一个简单的打字错误。 这一行:

if ($_) {computername=$_}
应该是:

if ($_) {$computername=$_}

使用高级函数有很多优点,但不需要具有接受管道输入的函数

这是张贴的。未声明$ComputerName是导致输出错误的原因。非常感谢,新年快乐。太好了!很高兴听到你开始跑步了!为张贴的作品欢呼。未声明$ComputerName是导致输出错误的原因。非常感谢,新年快乐。太好了!很高兴听到你开始跑步了!干杯