SOS*_*idb 0 powershell powershell-2.0
我正在 PowerShell 中创建一个并不总是包含数据的数组(有时它是空的)。在尝试对数组对象执行任何操作之前,我需要验证数组是否包含数据。当我使用以下代码时,一切都按预期工作:
$Array = @(“This”,”is”,”a”,”test”)
$Array | ForEach-Object {
If ($Array.Count -ge 1)
{
[string]$A = $_
Write-Host $A
}
}
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,我得到以下输出:
This
is
a
test
Run Code Online (Sandbox Code Playgroud)
每次处理数组中的对象时,上面都会检查数组的.Count(因此它可能会检查数组的计数一千次或更多,具体取决于数组中的对象数量)。我想要做的是在开始处理数组对象之前只检查一次数组的计数。但是,以下代码没有提供正确的输出:
$Array = @(“This”,”is”,”a”,”test”)
If ($Array.Count -ge 1)
{
$Array | ForEach-Object {
{
[string]$A = $_
Write-Host $A
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,我得到以下输出:
[string]$A = $_
Write-Host $A
[string]$A = $_
Write-Host $A
[string]$A = $_
Write-Host $A
[string]$A = $_
Write-Host $A
Run Code Online (Sandbox Code Playgroud)
它不像前面的代码那样写托管$A变量的值,而是打印出实际的 PowerShell 代码本身。我所做的只是移动.Count检查,以便它在开始处理数组中的对象之前检查计数。为什么在ForEach-Object语句之前移动数组计数检查时会得到上述输出?每次处理数组中的对象时是否都必须检查数组计数?
谢谢
我在猜测 Powershell 为您的第二个示例打印此内容的原因
[string]$A = $_
Write-Host $A
[string]$A = $_
Write-Host $A
Run Code Online (Sandbox Code Playgroud)
是因为 Powershell 将双括号{{}}作为字符串文字。
至于如何使其工作,您应该$Array在执行 for 循环之前测试。
代码如下所示:
$Array = @(“This”,”is”,”a”,”test”)
if($Array.Count -ge 1){
foreach($A in $Array){
Write-Host $A
}
}
Run Code Online (Sandbox Code Playgroud)
并且作为单线(ish)
$Array = @(“This”,”is”,”a”,”test”)
if($Array.Count -ge 1){ $Array| %{Write-Host $_}}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8235 次 |
| 最近记录: |