Function 如何传递变量值以调用命令
我正在尝试获取处于特定状态(已保存、正在运行、已停止)的计算机列表。我将机器的状态作为函数中的参数传递Function 如何传递变量值以调用命令,function,powershell,variables,invoke-command,Function,Powershell,Variables,Invoke Command,我正在尝试获取处于特定状态(已保存、正在运行、已停止)的计算机列表。我将机器的状态作为函数中的参数传递 Function global:Resource-Summary { Param( [parameter(mandatory=$true)] $ProgramName, [parameter(mandatory=$true)] $ServerName ) PROCESS { Foreach ($Server in $ServerNam
Function global:Resource-Summary
{
Param(
[parameter(mandatory=$true)] $ProgramName,
[parameter(mandatory=$true)] $ServerName
)
PROCESS
{
Foreach ($Server in $ServerName)
{
Invoke-Command -ComputerName $Server -ScriptBlock {
$VMs = Get-VM
$colVMs = @()
foreach ($VM in $VMs)
{
$objVM = New-Object System.Object
$objVM | Add-Member -MemberType NoteProperty -Name VMName -Value $VM.VMName
$objVM | Add-Member -MemberType NoteProperty -Name VMNotes -Value $VM.Notes
$objVM | Add-Member -MemberType NoteProperty -Name VMState -Value $VM.State
$colVMs += $objVM
}
$a = @{Expression={$_.VMName};Label='VM Name'}, `
@{Expression={$_.VMNotes};Label='VM Description'}, `
@{Expression={$_.VMState};Label='State'}
"Program Name : $ProgramName"
$colVMs |Where-Object {($_.VMState -eq '$ProgramName')} | Format-Table $a -AutoSize
} -ArgumentList $ProgramName
}
}
}
当我运行Resource Summary-ProgramName Running-ServerName Demo
我没有得到任何价值
当我将
$ProgramName
替换为RUNNING
时,我得到了预期的输出 有几件事会跳出来:
如果在单引号内有一个变量,则PowerShell不会自动解析该变量,因此在本节中,您实际上是将VM的状态与字符串$ProgramName进行比较,而不是将其值进行比较:
$_.VMState -eq '$ProgramName'
尝试更改为双引号,或者根本不使用双引号
另外,检查括号-您缺少Where对象的结尾部分。有几个东西跳出: 如果在单引号内有一个变量,则PowerShell不会自动解析该变量,因此在本节中,您实际上是将VM的状态与字符串$ProgramName进行比较,而不是将其值进行比较:
$_.VMState -eq '$ProgramName'
尝试更改为双引号,或者根本不使用双引号
此外,请检查括号-您缺少Where对象的结尾部分。有关参考信息,请参阅例如关于如何操作的文章 脚本中的问题是如何调用脚本块,这在上面的链接中有更详细的解释,但是您需要以与调用函数一样的方式向其传递任何“外部”输入
Function global:Resource-Summary
{
Param(
[parameter(mandatory=$true)] $ProgramName,
[parameter(mandatory=$true)] $ServerName
)
PROCESS
{
Foreach ($Server in $ServerName)
{
Invoke-Command -ComputerName $Server -ScriptBlock {
$VMs = Get-VM
$colVMs = @()
foreach ($VM in $VMs)
{
$objVM = New-Object System.Object
$objVM | Add-Member -MemberType NoteProperty -Name VMName -Value $VM.VMName
$objVM | Add-Member -MemberType NoteProperty -Name VMNotes -Value $VM.Notes
$objVM | Add-Member -MemberType NoteProperty -Name VMState -Value $VM.State
$colVMs += $objVM
}
$a = @{Expression={$_.VMName};Label='VM Name'}, `
@{Expression={$_.VMNotes};Label='VM Description'}, `
@{Expression={$_.VMState};Label='State'}
"Program Name : $ProgramName"
$colVMs |Where-Object {($_.VMState -eq '$ProgramName')} | Format-Table $a -AutoSize
} -ArgumentList $ProgramName
}
}
}
您这样做部分是正确的,您正在使用-ArgumentList
参数将$ProgramName
发送到scriptslock,但您尚未在scriptblock中指定如何访问它
例如,退房
Invoke-Command -ArgumentList "Application" -ScriptBlock {
param($log)
Get-EventLog $log
}
此处-ArgumentList
包含输入,在scriptblock中,$log
被赋值
更新脚本以将其考虑在内:
Function global:Resource-Summary
{
Param(
[parameter(mandatory=$true)] $ProgramName,
[parameter(mandatory=$true)] $ServerName
)
PROCESS
{
Foreach ($Server in $ServerName)
{
Invoke-Command -ComputerName $Server -ScriptBlock {
param($name)
$VMs = Get-VM
$colVMs = @()
foreach ($VM in $VMs)
{
$objVM = New-Object System.Object
$objVM | Add-Member -MemberType NoteProperty -Name VMName -Value $VM.VMName
$objVM | Add-Member -MemberType NoteProperty -Name VMNotes -Value $VM.Notes
$objVM | Add-Member -MemberType NoteProperty -Name VMState -Value $VM.State
$colVMs += $objVM
}
$a = @{Expression={$_.VMName};Label='VM Name'}, `
@{Expression={$_.VMNotes};Label='VM Description'}, `
@{Expression={$_.VMState};Label='State'}
"Program Name : $ProgramName"
$colVMs |Where-Object {($_.VMState -eq "$name") | Format-Table $a -AutoSize
}
} -ArgumentList $ProgramName
}
}
}
另外,在我看来,
-ArgumentList
在错误的一行,它需要在下面的结束括号之后,一行完成。这样,它与Invoke命令和scriptblock位于同一个cmdlet上。有关参考信息,请参阅本篇关于如何使用的文章
脚本中的问题是如何调用脚本块,这在上面的链接中有更详细的解释,但是您需要以与调用函数一样的方式向其传递任何“外部”输入
Function global:Resource-Summary
{
Param(
[parameter(mandatory=$true)] $ProgramName,
[parameter(mandatory=$true)] $ServerName
)
PROCESS
{
Foreach ($Server in $ServerName)
{
Invoke-Command -ComputerName $Server -ScriptBlock {
$VMs = Get-VM
$colVMs = @()
foreach ($VM in $VMs)
{
$objVM = New-Object System.Object
$objVM | Add-Member -MemberType NoteProperty -Name VMName -Value $VM.VMName
$objVM | Add-Member -MemberType NoteProperty -Name VMNotes -Value $VM.Notes
$objVM | Add-Member -MemberType NoteProperty -Name VMState -Value $VM.State
$colVMs += $objVM
}
$a = @{Expression={$_.VMName};Label='VM Name'}, `
@{Expression={$_.VMNotes};Label='VM Description'}, `
@{Expression={$_.VMState};Label='State'}
"Program Name : $ProgramName"
$colVMs |Where-Object {($_.VMState -eq '$ProgramName')} | Format-Table $a -AutoSize
} -ArgumentList $ProgramName
}
}
}
您这样做部分是正确的,您正在使用-ArgumentList
参数将$ProgramName
发送到scriptslock,但您尚未在scriptblock中指定如何访问它
例如,退房
Invoke-Command -ArgumentList "Application" -ScriptBlock {
param($log)
Get-EventLog $log
}
此处-ArgumentList
包含输入,在scriptblock中,$log
被赋值
更新脚本以将其考虑在内:
Function global:Resource-Summary
{
Param(
[parameter(mandatory=$true)] $ProgramName,
[parameter(mandatory=$true)] $ServerName
)
PROCESS
{
Foreach ($Server in $ServerName)
{
Invoke-Command -ComputerName $Server -ScriptBlock {
param($name)
$VMs = Get-VM
$colVMs = @()
foreach ($VM in $VMs)
{
$objVM = New-Object System.Object
$objVM | Add-Member -MemberType NoteProperty -Name VMName -Value $VM.VMName
$objVM | Add-Member -MemberType NoteProperty -Name VMNotes -Value $VM.Notes
$objVM | Add-Member -MemberType NoteProperty -Name VMState -Value $VM.State
$colVMs += $objVM
}
$a = @{Expression={$_.VMName};Label='VM Name'}, `
@{Expression={$_.VMNotes};Label='VM Description'}, `
@{Expression={$_.VMState};Label='State'}
"Program Name : $ProgramName"
$colVMs |Where-Object {($_.VMState -eq "$name") | Format-Table $a -AutoSize
}
} -ArgumentList $ProgramName
}
}
}
另外,在我看来,-ArgumentList
在错误的一行,它需要在下面的结束括号之后,一行完成。这样,它与调用命令和脚本块位于同一cmdlet上。请检查您的问题:您真的调用资源摘要-程序名…
,还是资源摘要-程序名…
?很抱歉,问题中有输入错误。我使用Resource Summary-ProgramName Running-ServerName Demo..请检查您的问题:您真的调用Resource Summary-Program name…
,还是Resource Summary-ProgramName…
?很抱歉,问题中有输入错误。我使用Resource Summary-ProgramName Running-ServerName Demo..Kim,我正在寻找关于这方面的更多帮助。在我的示例中,我将所有数据存储到一个数组$a。如何将其存储在哈希表中???请帮我把这篇博客和这篇文章都删掉。这两篇文章都展示了如何创建多维数组。希望这能让你开始:)金姆,我想在这方面再找一个人帮忙。在我的示例中,我将所有数据存储到一个数组$a。如何将其存储在哈希表中???请帮我把这篇博客和这篇文章都删掉。这两篇文章都展示了如何创建多维数组。希望这能让你开始:)