支持资源

支持资源

假设我有一个简单的test.ps1

Write-Host "access input for the 1st time: $input"
Write-Host "access input for the 2nd time: $input"

然后我就这么做了'foo' | .\test.ps1

将会输出:

第一次访问输入:foo
第二次访问输入:

访问$input一次之后,值就没了。为什么?

文档说这是因为 $input 是一个枚举器:

由于 $input 是一个枚举器,访问其任何属性都会导致 $input 不再可用。您可以将 $input 存储在另一个变量中以重复使用 $input 属性。

但我不明白成为一名普查员意味着什么。

据我所知,如果我通过管道输入一个列表,由于我没有块,因此不会枚举该列表process{}。例如,如果我这样做@(1,2,3) | .\test.ps1,我的代码将仅运行一次,并且数组将被视为单个对象。

第一次访问输入:1 2 3
第二次访问输入:

所以我不明白什么是被枚举的,以及为什么 $input 是一个枚举器。

答案1

你需要考虑一下描述中的其他内容,也许可以看看about_Functions_Advanced关于函数高级方法

你的例子没什么意义。调用脚本会将其作为匿名函数运行。由于你只让它使用$input第一种情况,所以会发生以下情况:

在没有开始、处理或结束块的函数中,$input 变量枚举该函数的所有输入的集合。

Write-Host接受枚举并对其进行迭代。因此,您似乎只能获得一个值。本质上,它是在其上调用“.toString()”。

使用循环你会发现你确实得到了单独的值。

$counter = 0;
$input | ForEach-Object {
    Write-Host "access input for the $counter time: $_"
    $counter = $counter + 1
}

如果您确实需要此功能,最好使用流程块。请查看高级功能帮助以获取有关其含义的更多信息。

begin {
    $counter = 0
}
process {
    Write-Host "access input for the $counter time: $_"
    $counter = $counter + 1
}

请记住,在这种情况下$input工作方式会略有改变。

根据关于普查员的信息具有适当定义的常规函数​​参数通常比直接使用更好$input

答案2

通过管道传递“事物列表”列表foreach-object循环并使用其中的脚本/函数调用scriptblock

在其中scriptblock,将迭代值传递到函数调用,如下所示输入获取每次调用返回的输出值的预期值。

此 PowerShell 解决方案将脚本逻辑包装在简单函数语句块,您不必重复Write-Output代码多次——标准、简单和基本。

因此,没必要特别担心区块process{}

PowerShellTest.ps1脚本

Function Test {
    Write-Output "Access to your mom's: $input"
    };

电源外壳点源脚本并调用它

. "$Env:USERPROFILE\Desktop\test.ps1"
@("car","house","bank account") | % { $_ | test  }

输出

Access to your mom's: car
Access to your mom's: house
Access to your mom's: bank account

逻辑分解

在此处输入图片描述

但我不明白成为一名普查员意味着什么。

此外,根据$input陈述如下文引用和引用,这意味着它将成为作为输入传递的输入值的占位符,因此它会枚举传递的值。您$input在脚本中使用,它包含作为输入接收的值。您遇到的问题是,所有值都作为这些方法的一个长连接字符串传递。

  • 包含枚举器,枚举传递给函数的所有输入。该$input变量仅适用于函数和脚本块(未命名的函数)。

    来源

,你没有理解的另一句话只是说it [ $input] 仅在被调用的实例中保存该值。您不能使用它$input在调用之前或之后获取任何值,它只能设置为调用时的输入值。

最后,你可以在函数调用时设置变量$input为您提供在调用时“枚举”的输出(即$var = "jewelry box" | test)。这意味着变量随后在调用之外可用,$input其值为执行时的值。

其他潜在的奖金解决方案

## Input piped to script function call
@("car","house","bank account").ForEach( {$_ | test} );

## Uses "$_" as the placeholder to contain the value iterated right to the command no script or function needed
@("car","house","bank account").ForEach( { Write-Output "Access to your mom's: $_" } );

支持资源

相关内容