如何在Powershell中区分空参数和零值参数?

10

我希望能够通过一个 int 变量传递给 PowerShell 脚本,并能够判断变量是否为空。我的理解是,以下代码应该能够判断参数是否为 null:

if (!$args[0]) { Write-Host "Null" }
else { Write-Host "Not null" }

当我尝试将0作为整数传递时,这很好用。如果我使用0作为参数,PowerShell将其视为null。有什么正确的方法可以区分参数为空还是具有零值?

3个回答

16

您可以直接测试$args变量或$args.count以查看传递到脚本的变量数量。

另外,$args[0] -eq $null$args[0] -eq 0!$args[0]是不同的。


1
没意识到 $args[0] -eq $null!$args[0] 之间有区别,非常感谢! - Ryan Gillies
1
如果您直接在条件语句中使用$Var,则会将所有为$Null或0的内容计算为$False,而其他所有内容则计算为$True。因此,If(-1)始终为False。 - Michael Kargl
1
@MichaelKargl,“if(-1)始终为false”是什么意思?-1评估为True(尝试[bool]-1)。此外,请注意,除了$null0之外,空字符串也会评估为False[bool]"")。 - Rynant
我的错.. 打错了.. 它总是$True,因为它不等于0。 - Michael Kargl
6
如果能解释这些等式检查之间的差异,此答案将更好。从现有内容中我可以听出它们是不同的,但不知道为什么。应该告诉我如何正确地检查空/空值/零参数。 - P.Brian.Mackey

5

如果像我这样的用户来自 Google 并想知道如何处理空的命令行参数,这里有一个可能的解决方案:

if (!$args) { Write-Host "Null" }

这段代码检查了$args数组。如果您想要检查数组的第一个元素(即第一个cmdline参数),请使用OP提供的解决方案:

if (!$args[0]) { Write-Host "Null" }

2
如果变量在param()中声明为整数,则其值将为'0',即使没有为参数指定值也是如此。要防止这种情况发生,您必须将其声明为可空:
如果变量在param()中声明为整数,则其值将为'0',即使没有为参数指定值也是如此。要防止这种情况发生,您必须将其声明为可空:
param([AllowNull()][System.Nullable[int]]$Variable)

这将使您能够使用If ($Variable -eq $null) {}进行验证。最初的回答。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接