2012-03-01 130 views
7

我发现通过PowerShell管道将函数传递给函数会将它们转换为string对象。如果我将该对象作为参数传递,它将保持其类型。为了证明:使用具有函数的管道获取不同的结果

我已经其显示对象的类型和值以下PowerShell的函数:

function TestFunction { 
    param (
     [Parameter(
      Position=0, 
      Mandatory=$true, 
      ValueFromPipeline=$true 
     )] $InputObject 
    ) 

    Echo $InputObject.GetType().Name 
    Echo $InputObject 
} 

我跑这个脚本来测试功能:

[string[]] $Array = "Value 1", "Value 2" 

# Result outside of function. 
Echo $Array.GetType().Name 
Echo $Array 
Echo "" 

# Calling function with parameter. 
TestFunction $Array 
Echo "" 

# Calling function with pipeline. 
$Array | TestFunction 

这将产生输出:

String[] 
Value 1 
Value 2 

String[] 
Value 1 
Value 2 

String 
Value 2 

编辑:我如何使用管道将整个数组传递给一个有趣的ction?

回答

7

处理经由你需要在你的函数的过程块管线收到多个项目:

function Test-Function { 
    param (
     [Parameter(ValueFromPipeline=$true)] $Test 
    ) 

    process { 
     $Test.GetType().FullName 
     $Test 
    } 
} 

[string[]] $Array = "Value 1", "Value 2" 
$Array | Test-Function 

更多信息:

+0

美丽!这是它的工作。谢谢!下一次,我会RTFM。 :-) – 2012-03-01 05:31:11

0

您是否尝试过将不是字符串的东西传递给该函数?

试用: 1, 2 | TestFunction

编辑:

试试这个。我所做的唯一改变是添加了约$ InputObject一个过程

function TestFunction { 
    param (
     [Parameter(
      Position=0, 
      Mandatory=$true, 
      ValueFromPipeline=$true 
     )] $InputObject 
    ) 

    process 
    { 
    Echo $InputObject.GetType().Name 
    Echo $InputObject 
    } 
} 
+0

即示出了如'的Int32 []'用于前两个测试,和'Int32'用于最终测试。最后的测试仍然只显示最后一个值而不是整个数组。我编辑了这个问题来澄清。 – 2012-03-01 04:58:58

3

除了有一个进程块,你还需要处理数组中的每个项目。当数组作为参数传递时,不需要通过管道传递数组。考虑这个:

function Test-Function 
{ 
    param (
     [Parameter(
      Position=0, 
      Mandatory=$true, 
      ValueFromPipeline=$true 
     )] $InputObject 
    ) 

    process 
    { 
     $InputObject.GetType().Name 
    } 
} 

$Array = "Value 1","Value 2" 
Test-Function $array 

结果将是String [],这可能不是你想要的。下面的命令将打印的每个项目的类型的阵列中不管参数如何传递:

function Test-Function 
{ 
    param (
     [Parameter(
      Position=0, 
      Mandatory=$true, 
      ValueFromPipeline=$true 
     )] $InputObject 
    ) 

    process 
    { 
     foreach($i in $InputObject) 
     { 
      $i.GetType().Name 
     } 
    } 
} 
+0

哈希表数组呢?我已经有一个Process块,并且数组仍然在流水线上展开。 没关系,我想通了。在这个例子中,它将是'Test-Function,$ array' – 2016-06-03 18:15:49

相关问题