是否有一种简单的方法来确保返回的所有值都为真?在下面的示例中,我有一组表示文件的对象。在继续之前,我想确保所有源文件都存在。我将所有路径传递到测试路径,函数为每个文件返回True/False。
> $filesToUpdate = @(
[PsCustomObject] @{ Source = (Join-Path $basePath "Abc.module"); }
[PsCustomObject] @{ Source = (Join-Path $basePath "Def.module"); }
)
> $filesToUpdate.Source | Test-Path
True
True
> # How can I check if all the returned values are true?
我如何检查所有返回值都是真的?
PowerShell不直接具有任何类似LINQ的等价物(尽管有一些第三方模块为您提供这些功能)。
不过,一般来说,您可以简单地过滤这些项目。如果里面有任何$false
值,以下表达式将返回一个真值:
$filesToUpdate.Source | Test-Path | ? { $_ -ne $true }
因此,为了在所有路径都存在时得到“真”,您可以反过来:
!($filesToUpdate.Source | Test-Path | ? { $_ -ne $true })
或者,在您的特定情况下,您也可以将您的列表直接与< code>Test-Path结合起来:
$filesToUpdate.Source | ? { !(Test-Path $_) }
这将为您提供所有不存在的文件;当有任何文件不存在时(即,当并非所有文件都存在时),它最终是一个真实值(可以在条件中使用)。
if (($filesToUpdate.Source | Test-Path) -contains $false){
#We know that one of the attempts was a failure
}
else{
#proceed
}
为了从更广泛的角度补充FoxDeploy的有用答案,管道使用:
tl;dr:
> < li>
(测试路径filesToUpdate。source)-包含$false
:
> < li>
快速,但不适合非常大的集合,因为输入集合必须整体放入内存中(在本问题的上下文中就是这样)。
< code>Test-Path接受一个数组作为输入,并输出一个反映每个输入项存在的并行数组;< code>-contains测试LHS数组中RHS标量的成员资格。
< code > $ false-ne($filesto update。源|测试路径|?{ -not $_ } |选择对象优先1)
> < li>
如果输入集合太大,整个内存容纳不下/内存使用必须保持不变,则必须采用这种方法。
?{ -不是 $_ }
(简称:其中对象 { -not $_ }
)按测试路径
筛选布尔值,使其仅包含$false
值(如果有)。因此,仅当至少存在一个$false
值时,筛选器才会生成输出。
选择对象-First 1
通过在接收到第一个对象(第一个$false
value)时退出管道来优化处理[PSv3],如果有的话,这意味着输出要么是单个$false
值,要么根本没有输出。
$false
)到无(没有项目映射到$false
)。<代码> $false -ne...然后测试管道的输出是否不是< code>$false,这意味着< code>Test-Path为所有输入路径返回< code>$true。
$false
的显式比较,因为-not(…)
/!(…)
不会按预期工作,因为否定不产生输出的命令也会产生$true
。通常,管道是PowerShell中不可或缺的强大概念,尽管它们会引入处理开销,但由于其概念上的优雅,它们值得使用,除非它们会带来性能问题。
> < li>
如果性能至关重要,可以绕过管道,但这可能会很麻烦。
相反,PowerShell灵活的操作符有时会提供概念上优雅且快速的解决方案,就像这里的情况一样,尽管可能会以内存消耗为代价。< br >在这种情况下使用管道的唯一原因是为了处理大型输入集合。
为了让您了解相对性能,以下是比较解决方案的测试计时,参数化为输入集合的大小和平均运行次数。
在底部找到测试脚本。
请注意,构造输入数据是为了将第一个(也是唯一一个)不存在的路径放在输入集合的中间。
这个选择极大地影响了选择对象优先1
解决方案的性能:如果您将一个不存在的路径放在开头,它将表现最好,如果您将其放在末尾或根本不包含路径,则将再次没有性能(相反)。
来自我的机器(2012年末iMac)的示例数字,以秒为单位:
> .\Test.ps1 -count 10 -repeat 10 # 10 input items, timing averaged over 10 runs
Command 10-run average
------- --------------
-contains, no pipeline .00124
-contains, pipeline .00170
pipeline, where-object, select -first 1 .00276
pipeline, where-object .00314
pipeline, where-object, Test-Path in script block .00460
> .\Test.ps1 -count 100 -repeat 10
Command 10-run average
------- --------------
-contains, no pipeline .01190
pipeline, where-object, select -first 1 .01328
-contains, pipeline .01836
pipeline, where-object .02365
pipeline, where-object, Test-Path in script block .03725
> .\Test.ps1 -count 1000 -repeat 10
Command 10-run average
------- --------------
pipeline, where-object, select -first 1 .11154
-contains, no pipeline .11764
-contains, pipeline .16508
pipeline, where-object .22246
pipeline, where-object, Test-Path in script block .37015
> .\Test.ps1 -count 10000 -repeat 10
Command 10-run average
------- --------------
pipeline, where-object, select -first 1 1.09919
-contains, no pipeline 1.15089
-contains, pipeline 1.75926
pipeline, where-object 2.21868
pipeline, where-object, Test-Path in script block 3.65946
Test.ps1
param(
[int] $count = 50
,
[int] $repeat = 10
)
# Create sample input array.
$paths = @('c:') * $count
$paths[$paths.Count / 2] = 'nosuch'
$timingPropName = "$repeat-run average"
@(
[pscustomobject] @{ Command = "-contains, no pipeline"; $timingPropName =
(1..$($repeat) | % { (Measure-Command { (Test-Path $paths) -contains $false }).TotalSeconds } |
Measure-Object -average | % Average) }
[pscustomobject] @{ Command = "-contains, pipeline"; $timingPropName =
(1..$($repeat) | % { (Measure-Command { ($paths | Test-Path) -contains $false }).TotalSeconds } |
Measure-Object -average | % Average) }
[pscustomobject] @{ Command = "pipeline, where-object, select -first 1"; $timingPropName =
( 1..$($repeat) | % { (Measure-Command { $paths | Test-Path | ? { $_ -eq $false } | Select-Object -First 1 }).TotalSeconds } |
Measure-Object -average | % Average) }
[pscustomobject] @{ Command = "pipeline, where-object"; $timingPropName =
(1..$($repeat) | % { (Measure-Command { $paths | Test-Path | ? { $_ -eq $false } }).TotalSeconds } |
Measure-Object -average | % Average) }
[pscustomobject] @{ Command = "pipeline, where-object, Test-Path in script block"; $timingPropName =
(1..$($repeat) | % { (Measure-Command { $paths | ? { !(Test-Path $_) } }).TotalSeconds } |
Measure-Object -average | % Average) }
) |
Sort-Object $timingPropName |
Format-Table Command, @{ n=$timingPropName; e={ '{0:.00000}' -f $_.$timingPropName } }
问题内容: 我想检查所有值(即对应于字典中所有键的值)是否为0。是否有没有循环的方法?如果可以,怎么办? 问题答案: 用途: 如果给定的iterable的所有元素都为true,则返回。
如果所有div都设置了display none,我想显示类似“找不到结果”的消息
问题内容: 我尝试添加 检查返回的对象是否为空,但是它不起作用。 有人可以告诉我这是怎么回事吗? 问题答案: 只需测试数组是否为空。
我必须使用一个c函数(),它在失败时返回标量、或。 这适用于以下故障: 但对于有效的论点,我得到: 如何检查呼叫是否成功?
问题内容: 在Java中,给定一个值数组(例如整数),是否有一种方法可以有效地检查它们是否都具有特定值? 例如,使用整数数组,例如: 并且只有在所有条件均为2的情况下,您才需要执行一项操作?有没有比这更有效的方法: 我知道可以用C ++做到这一点,但是Java呢? 问题答案: 或者,如果使用Java 8,则可以执行以下操作: 基本上,使用Streams可以非常简洁地完成与集合/数组有关的所有操作。
问题内容: 我的服务器端代码返回一个值,该值成功时为json对象,失败时为字符串’false’。现在如何检查返回的值是否为json对象? 问题答案: 如果字符串是JSON,则jQuery.parseJSON()应该返回类型为“对象”的对象,因此您只需使用以下命令检查类型