当前位置: 首页 > 知识库问答 >
问题:

我如何检查所有返回的值是否为真?

潘弘博
2023-03-14

是否有一种简单的方法来确保返回的所有值都为真?在下面的示例中,我有一组表示文件的对象。在继续之前,我想确保所有源文件都存在。我将所有路径传递到测试路径,函数为每个文件返回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?

我如何检查所有返回值都是真的?

共有3个答案

东方富
2023-03-14

PowerShell不直接具有任何类似LINQ的等价物(尽管有一些第三方模块为您提供这些功能)。

不过,一般来说,您可以简单地过滤这些项目。如果里面有任何$false值,以下表达式将返回一个真值:

$filesToUpdate.Source | Test-Path | ? { $_ -ne $true }

因此,为了在所有路径都存在时得到“真”,您可以反过来:

!($filesToUpdate.Source | Test-Path | ? { $_ -ne $true })

或者,在您的特定情况下,您也可以将您的列表直接与< code>Test-Path结合起来:

$filesToUpdate.Source | ? { !(Test-Path $_) }

这将为您提供所有不存在的文件;当有任何文件不存在时(即,当并非所有文件都存在时),它最终是一个真实值(可以在条件中使用)。

谭琛
2023-03-14
if (($filesToUpdate.Source | Test-Path) -contains $false){
#We know that one of the attempts was a failure
}
else{
#proceed
}
石俊雄
2023-03-14

为了从更广泛的角度补充FoxDeploy的有用答案,管道使用:

tl;dr:

> < li>

(测试路径filesToUpdate。source)-包含$false:

> < li>

快速,但不适合非常大的集合,因为输入集合必须整体放入内存中(在本问题的上下文中就是这样)。

< code>Test-Path接受一个数组作为输入,并输出一个反映每个输入项存在的并行数组;< code>-contains测试LHS数组中RHS标量的成员资格。

< code > $ false-ne($filesto update。源|测试路径|?{ -not $_ } |选择对象优先1)

> < li>

如果输入集合太大,整个内存容纳不下/内存使用必须保持不变,则必须采用这种方法。

    < li >注意:在这里,管道输入< code>$filesToUpdate。Source根据定义是一个内存中的集合,但是所讨论的场景适用于这样的命令,这些命令逐个产生大量的输出对象并将它们发送到管道。

?{ -不是 $_ }(简称:其中对象 { -not $_ })按测试路径筛选布尔值,使其仅包含$false值(如果有)。因此,仅当至少存在一个$false值时,筛选器才会生成输出。

选择对象-First 1通过在接收到第一个对象(第一个$falsevalue)时退出管道来优化处理[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()应该返回类型为“对象”的对象,因此您只需使用以下命令检查类型