我有一个我继承的powershell函数。它在没有输入或提供单个服务器名称作为输入时工作正常。
当像这样运行时,功能起作用
Get-DiskUtil
或
Get-DiskUtil computername
但如果我尝试
Get-Content c:\psfiles\servers.txt | Foreach-Object {Get-DiskUtil}
(如果我在servers.txt中列出了三台服务器,这会给本地机器的输出三次。)
或
Get-Content C:\psfiles\servers.txt | Get-DiskUtil
结果仅提供本地计算机名称的输出和此错误三次。
有人可以告诉我为什么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
GET-磁盘工具:
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)}}
}
}
答案 0 :(得分:4)
看起来像是一个简单的错字。 这一行:
if ($_) {computername=$_}
应该是:
if ($_) {$computername=$_}
使用高级功能有许多优点,但不需要具有接受来自管道的输入的功能。
答案 1 :(得分:3)
问题在于您已创建了一个功能。函数不接受创建高级函数所需的管道输入。
Function Get-DiskUtil {
[CmdLetBinding]
Param([parameter(Mandatory=$true,
ValueFromPipeline=$true)]
[string] $computername=$env:computername)
)
这将允许该参数被引入管道。你也可以通过重新调用你的调用代码来解决这个问题
Get-Content c:\psfiles\servers.txt | % {Get-DiskUtil $_}
答案 2 :(得分:1)
您需要做的就是将[Parameter(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