检查变量是否为空



我想检查变量是否为空:

function send_null_param ([ref]$mycredentials){
if (! $mycredentials) {
Write-Host 'Got no credentials'
$mycredentials = Get-Credential 'mydomain.commyuserid' 
} else {
Write-Host 'Got credentials'
}
}
$myidentifier = $null
send_null_param ([ref]$myidentifier)

此代码基于: https://www.thomasmaurer.ch/2010/07/powershell-check-variable-for-null/, 但这行不通。

我该如何解决这个问题?

附言。Stack Overflow中有一些字符串为空,但没有更通用的内容: 检查字符串是否不为 NULL 或 NULL

由于您尝试在不存在的情况下将$myCredentialGet-Credential一起分配,那么我假设您希望您的参数是[PSCredential]

在这种情况下,请强键入您的参数,并将其标记为必需参数(顺便说一下[ref]根本不需要:

function Get-MyCredential {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[PSCredential]
$Credential
)
Write-Host "Got credential with username '$($Credential.Username)'"
}

这样,您真的根本不需要进行任何检查。将其设置为必需可让 PowerShell 为你强制实施,并将其设为[PSCredential]可确保对象从一开始就是有效的[PSCredential]

您可能想要检查的唯一其他情况是空凭据,具体取决于您对凭据执行的操作。

为此,您可以将其与[PSCredential]::Empty进行比较,并且可以在验证属性中执行此操作,以便在参数绑定上完成:

function Get-MyCredential {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[PSCredential]
[ValidateScript( {
$_ -ne [PSCredential]::Empty
} )
$Credential
)
Write-Host "Got credential with username '$($Credential.Username)'"
}

如果需要,您可以在其中进行其他验证(检查某种用户名格式,例如是否需要是电子邮件地址或其他内容)。如果它很复杂,则最好在函数体内完成,具体取决于场景。

但在大多数情况下,您可能根本不需要额外的验证。

这按预期工作。您在参数中使用了 [ref]。您可以将其视为指针。如果将变量传递给指针,指针将包含变量的地址。值无关紧要。

[ref] 不是指针,但概念是它是类型为"System.Management.Automation.PSReference"的对象。

PSReference 类型的对象将引用的对象的实际值保存在属性"Value"下,当函数完成时,它会将值保存回原始变量。

如果您在 if 语句中使用 'mycredentials' 变量的 'Value'-Property,您的代码将起作用:

function send_null_param ([ref]$mycredentials){
if (! $mycredentials.Value) {
Write-host 'Got no credentials'
$mycredentials = Get-Credential 'mydomain.commyuserid' 
}
else {Write-host 'Got credentials'}
}
$myidentifier=$null
send_null_param ([ref]$myidentifier)

我同意briantist的观点,如果没有特殊原因你不应该使用[ref]。

将参数块添加到函数中并使其成为必需的。

Function New-Creds
{
[CmdletBinding()]
[Alias('nc')]
Param
(
[Parameter(Mandatory=$true, 
HelpMessage = 'This is a required field. It cannot be blank')]$MyCredentials
)
# Code begins here
$MyCredentials
}

结果

New-Creds -MyCredentials 
New-Creds : Missing an argument for parameter 'MyCredentials'. Specify a parameter of type 'System.Object' and try again.
At line:1 char:11
+ New-Creds -MyCredentials
+           ~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidArgument: (:) [New-Creds], ParameterBindingException
+ FullyQualifiedErrorId : MissingArgument,New-Creds

New-Creds
cmdlet New-Creds at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
MyCredentials: !?
This is a required field. It cannot be blank
MyCredentials: SomeCreds
SomeCreds
New-Creds -MyCredentials AnotherCred
AnotherCred

相关内容

  • 没有找到相关文章

最新更新