Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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
Function 如何传递变量值以调用命令_Function_Powershell_Variables_Invoke Command - Fatal编程技术网

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。如何将其存储在哈希表中???请帮我把这篇博客和这篇文章都删掉。这两篇文章都展示了如何创建多维数组。希望这能让你开始:)