我想检查一个变量是否为null:
function send_null_param ([ref]$mycredentials){
if (! $mycredentials) {
Write-Host 'Got no credentials'
$mycredentials = Get-Credential 'mydomain.com\myuserid'
} else {
Write-Host 'Got credentials'
}
}
$myidentifier = $null
send_null_param ([ref]$myidentifier)
此代码基于:https://www.thomasmaurer.ch/2010/07/powershell-check-variable-for-null/,但这不起作用。
我怎样才能解决这个问题?
PS。 Stack Overflow中有一些字符串为null但不是更通用的字符串:Check if a string is not NULL or EMPTY
因为你试图在没有$myCredential
的情况下分配Get-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'属性,您的代码将起作用:
function send_null_param ([ref]$mycredentials){
if (! $mycredentials.Value) {
Write-host 'Got no credentials'
$mycredentials = Get-Credential 'mydomain.com\myuserid'
}
else {Write-host 'Got credentials'}
}
$myidentifier=$null
send_null_param ([ref]$myidentifier)
如果没有特殊原因你不应该使用[参考],我同意briantist。
将param块添加到您的函数中并使其成为必需项。
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