相关疑难解决方法(0)

为什么空的PowerShell管道与null不同?

我试图理解@()数组构造函数的行为,我遇到了这个非常奇怪的测试.

似乎空管道的值与$ null"不完全"相同,即使它是-eq $ null

$y = 1,2,3,4 | ? { $_ -ge 5 }
$z = $null

if ($y -eq $null) {'y is null'} else {'y NOT null'}  ### y is null
if ($z -eq $null) {'z is null'} else {'z NOT null'}  ### z is null

$ay = @($y)
$az = @($z)

"ay.length = " + $ay.length  ### ay.length = 0
"az.length = " + $az.length  ### az.length = 1

$az[0].GetType()  ### throws exception because $az[0] is null …
Run Code Online (Sandbox Code Playgroud)

powershell null

7
推荐指数
2
解决办法
1935
查看次数

Are there 2 kinds of $null in PowerShell?

I've stumbled across an odd situation in PowerShell 5.1 (Windows 10) where ConvertTo-Json produces {} instead of null for an apparently null valued object:

[CmdletBinding()]
param()
function main() {
    $foo1 = $null
    Write-Verbose ("foo1 null? " + ($null -eq $foo1))
    $foo2 = try{1/0}catch{}
    Write-Verbose ("foo2 null? " + ($null -eq $foo2))
    $foo3 = try{1/0}catch{$null}
    return [PSCustomObject]@{"foo1"=$foo1; "foo2" = $foo2; "foo3" = $foo3} | ConvertTo-Json
}
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
main
Run Code Online (Sandbox Code Playgroud)

Running this cmdlet -verbose shows two apparently $null …

powershell null json automation-null

7
推荐指数
0
解决办法
75
查看次数

在 PowerShell 中,为什么 $null -lt 0 = $true?那可靠吗?

考虑以下 PowerShell 代码:

> $null -gt 0
False
> $null -ge 0
False
> $null -eq 0
False
> $null -le 0
True
> $null -lt 0
True
Run Code Online (Sandbox Code Playgroud)

当然,对于显式设置为$null或不存在变量的 $variable 也是如此。

  1. 这是为什么?这对我来说没有多大意义。我觉得 $null 根据定义没有可以这样测试的值,或者至少,它在这样的测试中评估为零。但除此之外,我想我不知道我实际上会期望什么行为。谷歌搜索(或搜索 SO)例如“为什么在 Powershell 中 null 小于零”似乎没有产生任何结果,尽管我确实看到了其他几种语言的相关问题和答案。
  2. 可以而且应该依赖这个结果吗?
  3. 除了使用 GetType() 或“IsNumeric”、“IsNullOrEmpty”等的各种实现测试变量之外,可靠地测试整数值(或其他类型)在一个可能具有值的变量中$null?或者这些方法之一被认为是非常标准的?

谢谢你的时间。如果这个问题对这个场地来说太“模糊”,请提前道歉。

PS我通常的环境是PowerShell v5.1。

powershell null

6
推荐指数
1
解决办法
221
查看次数

从 Get-ChildItem -Path 返回对象数组

从 powershell 中,ls -R *.txt将按目录递归列出文件,或者更好:

PS> Get-ChildItem -Path C:\Test -Name
Run Code Online (Sandbox Code Playgroud)

日志

PS> Get-ChildItem -Path C:\Test -Name
Run Code Online (Sandbox Code Playgroud)

但我如何将其输入数组?我想要一个文件(?)对象本身的数组,查看:

Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName

/sf/answers/1712811341/

我正在从这些类型的命令中寻找带有 powershell 的“文件”对象数组。

可能更好的语法:

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

但我不需要复制这些项目,而是想要一个对象,或者更确切地说,对象数组。不是文件的路径,也不是文件,大概是 powershell 引用或指向文件的指针。

(现在阅读精美的手册。)

windows directory powershell system-administration file

4
推荐指数
1
解决办法
7738
查看次数

当变量值为 $null 时运行 ForEach-Object 循环

在 PowerShell (5.1.14393.1944) 中,当我有一个值为 的变量时$nullForEach-Object循环会尝试迭代该对象,从而导致意外的结果。

在本例中,我尝试重新运行一组数据中的最高结果。但如果没有数据,-1则应返回。

function Get-MaximumResult
{
    param(
        [parameter(Mandatory,Position=0)]
        [AllowNull()]
        [object]$MetricsData
    )
    if (-not($MetricsData)) { Write-Host "Debug: Variable is null" }
    [int]$maximum = -1
    $MetricsData | ForEach-Object {
       if ([int]$_.maximum -gt $maximum) { $maximum = [int]$_.maximum }
       Write-Host "Debug: Maximum: $maximum"
    }
    return $maximum
}
Get-MaximumResult -MetricsData $null
Run Code Online (Sandbox Code Playgroud)

生成的输出如下 -

调试:变量为空调
试:最大值:0
0

我期望看到的是这样的——

调试:变量为空
-1

几年前我发现了几个类似的问题,但答案表明这个错误已在版本 3 中修复。还有其他人遇到过这个错误吗?

powershell foreach null

3
推荐指数
1
解决办法
2980
查看次数