我试图理解@()数组构造函数的行为,我遇到了这个非常奇怪的测试.
似乎空管道的值与$ 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) 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 -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 也是如此。
$null?或者这些方法之一被认为是非常标准的?谢谢你的时间。如果这个问题对这个场地来说太“模糊”,请提前道歉。
PS我通常的环境是PowerShell v5.1。
从 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
我正在从这些类型的命令中寻找带有 powershell 的“文件”对象数组。
可能更好的语法:
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text
但我不需要复制这些项目,而是想要一个对象,或者更确切地说,对象数组。不是文件的路径,也不是文件,大概是 powershell 引用或指向文件的指针。
(现在阅读精美的手册。)
在 PowerShell (5.1.14393.1944) 中,当我有一个值为 的变量时$null,ForEach-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 中修复。还有其他人遇到过这个错误吗?