【问题标题】:powershell pass system.object[] without unrollingpowershell pass system.object[] 不展开
【发布时间】:2011-04-11 17:42:26
【问题描述】:

关于如何在不展开的情况下传递 Get-PSCallStack 的任何想法。它似乎是一个 system.object[] 但从我在网上阅读的内容来看,它们在通过和“展开”时不会保持完整。我尝试在前面放置一个逗号来防止它,但没有奏效。

function Pass-Callstack ([System.Object]$arg0) {
Write-Host 'Start Pass-Callstack'
$psCallStack = $arg0
$psCallStackType = $psCallStack.GetType()
$psCallStackLength = $psCallStack.Length
$psCallStackCommand0 = $psCallStack[0].command 
$psCallStackCommand1 = $psCallStack[1].command
Write-Host $psCallStackType
Write-Host $psCallStackLength
Write-Host $psCallStackCommand0
Write-Host $psCallStackCommand1
$arg0 | gm
}

function Describe-Callstack {
Write-Host 'Start Describe-Callstack'
$psCallStack = (Get-PSCallStack)
$psCallStackType = $psCallStack.GetType()
$psCallStackLength = $psCallStack.Length
$psCallStackCommand0 = $psCallStack[0].command 
$psCallStackCommand1 = $psCallStack[1].command
Write-Host $psCallStackType
Write-Host $psCallStackLength
Write-Host $psCallStackCommand0
Write-Host $psCallStackCommand1
$psCallStack | gm
}
Describe-Callstack
Pass-Callstack (,$psCallStack)

【问题讨论】:

    标签: powershell argument-passing


    【解决方案1】:

    定义一个数组并将你想要的数组放在括号内。

    如果返回null,则返回一个大小为1的数组,值为空。

    $x = @(CallSomeMethodHere)

    所以我想你会想要: $x = @($psCallStack)

    【讨论】:

      【解决方案2】:

      当你将一个参数传递给一个函数而不用管道传递它时,就不会展开集合,例如

      function ArgShape($p)
      {
          $p.GetType().Fullname
          $p.Rank
          $p.Length
          $p[0].GetType().Fullname
      }
      
      ArgShape (Get-PSCallstack)
      
      System.Object[]
      1
      2
      System.Management.Automation.CallStackFrame
      

      此外,如果您希望传递调用堆栈的参数为数组,则可以这样指定:

      function Pass-Callstack([object[]]$array)
      

      注意使用“系统”。命名空间前缀是可选的。如果找不到类型,PowerShell 将在前面添加。此外,将参数指定为 [object] 本质上是无操作,因为这是默认类型。即[object]$arg0$arg0 相同。

      您还将 $null 传递到 Pass-Callstack (尽管包装在单个元素数组中)。变量 $psCallStack 是函数私有的,并且在函数外部不可见,除非您在它前面加上 $script:psCallStack 之类的修饰符。一般来说,我不推荐这种方法。您应该像这样从 Describe-Callstack 输出 $pscallstack:

      function Describe-Callstack { 
      Write-Host 'Start Describe-Callstack' 
      $psCallStack = (Get-PSCallStack) 
      $psCallStackType = $psCallStack.GetType() 
      $psCallStackLength = $psCallStack.Length 
      $psCallStackCommand0 = $psCallStack[0].command  
      $psCallStackCommand1 = $psCallStack[1].command 
      Write-Host $psCallStackType 
      Write-Host $psCallStackLength 
      Write-Host $psCallStackCommand0 
      Write-Host $psCallStackCommand1 
      $psCallStack 
      }
      

      然后将函数调用的输出赋值给一个变量:

      $cs = Describe-Callstack 
      

      并将其传递到 Pass-Callstack 例如:

      Pass-Callstack $cs
      

      【讨论】:

        猜你喜欢
        • 2020-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 2020-12-27
        • 2018-12-08
        相关资源
        最近更新 更多