假设我有一个简单的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: $_" } );
支持资源
.
(源或点运算符)- ForEach 对象
标准别名对于 Foreach 对象:'
%
' 符号,ForEach - ForEach 方法