当前位置: 首页 > 知识库问答 >
问题:

检查变量是否为空

潘银龙
2023-03-14

我想检查变量是否为空:

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。堆栈中有东西

共有3个答案

廉高邈
2023-03-14

将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
督飞羽
2023-03-14

这按预期工作。您在参数中使用了[ref]。你可以把它看作一个指针。如果将变量传递给指针,指针将包含变量的地址。价值不重要。

[ref]不是指针,但概念是它是“系统管理,自动化”类型的对象。

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

如果在 if 语句中使用“变量的”值“属性,则代码将起作用:

  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)

我同意布里安特主义者,如果没有特殊的原因,你不应该使用[ref]。

邵弘致
2023-03-14

由于您试图在缺少的情况下使用获取凭证分配$myCredential,因此我假设您希望参数为[pscredentials]

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

function Get-MyCredential {
[CmdletBinding()]
param(
    [Parameter(Mandatory=$true)]
    [PSCredential]
    $Credential
)

    Write-Host "Got credential with username '$($Credential.Username)'"
}

这样,您就真的不必进行任何检查。“使其成为强制”可让 PowerShell 为您强制执行该属性,并将其设置为 [PS 凭据] 可确保该对象从一开始就是有效的 [PS 凭据]

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

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

function Get-MyCredential {
[CmdletBinding()]
param(
    [Parameter(Mandatory=$true)]
    [PSCredential]
    [ValidateScript( {
        $_ -ne [PSCredential]::Empty
    } )
    $Credential
)

    Write-Host "Got credential with username '$($Credential.Username)'"
}

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

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

 类似资料:
  • 问题内容: 有什么最短的方法吗? 如果我是正确的,应该用? 有可能,并且在一行中写(也许是数组?)而不重复? 问题答案: 如果要测试变量是否 确实 是,请使用标识运算符: 如果要检查是否未设置变量: 或者,如果变量不为空,则为空字符串,零,..: 如果要测试变量是否不是空字符串,也将足够:

  • 问题内容: 如何检查变量是否为整数? 问题答案: 如果你需要这样做,请执行 除非你使用的是Python 2.x,否则需要 不要使用type。在Python中,这几乎永远不是正确的答案,因为它阻止了多态性的所有灵活性。例如,如果你子类化int,则你的新类应注册为int,但type不会这样做: 这符合Python强大的多态性:你应该允许行为类似于的任何对象int,而不是强制将其作为一个对象。 BUT

  • 问题内容: 我想知道如何检查变量是否是类(不是实例!)。 我试图使用该函数来执行此操作,但我不知道类将具有哪种类型。 例如,在以下代码中 我试图用 ??? 代替“ ” ,但我意识到这是python中的关键字。 问题答案: 更好的是:使用该功能。

  • 问题内容: 当我的函数f用一个变量调用时,我想检查var是否是一个熊猫数据框: 我想解决方案可能很简单,但即使 我无法使其按预期工作。 问题答案: 使用,没有别的: PEP8明确表示这是检查类型的首选方法 而且甚至不用考虑 处理继承(请参见type()和isinstance()之间的区别?)。例如,它会告诉你,如果一个变量是一个字符串(或),因为他们从派生) 专门针对 对象:

  • 问题内容: 假设我有任何变量,定义如下: 我想要一个检查变量类型是否像函数一样的函数。即: 如何检查变量是否为上述定义的类型? 问题答案: 当然,下划线的方式效率更高,但是当效率不是问题时,最好的检查方法是写在@Paul Rosania链接的下划线页面上。 受下划线启发,最终的isFunction函数如下:

  • 问题内容: 我该如何做: 健康)状况? (或某些原因,因为我很确定我刚才写的东西是完全错误的) 我正在尝试检查列表中的a是(空白)还是包含。 问题答案: 您可以将您的字符串与空字符串进行比较: 但是您可以将其缩写为: 说明:An通过为您提供的逻辑表达式计算值来实际起作用:或。如果仅使用变量名(或诸如“ hello”之类的文字字符串)而不是逻辑测试,则规则是:空字符串计为False,所有其他字符串计