【问题标题】:How do I assign a null value to a variable in PowerShell?如何为 PowerShell 中的变量分配空值?
【发布时间】:2015-02-24 13:41:08
【问题描述】:

我想为名为@9​​87654321@ 的变量分配一个空值,但它给了我错误。这是我的代码:

import-module activedirectory
$domain = "domain.example.com"
$dec = null
Get-ADComputer -Filter {Description -eq $dec}

【问题讨论】:

  • 值为$nullnull 如您所见,是一个错误。
  • 那是因为它应该是$null。我不敢相信最基本的搜索不会把它扔给你
  • 我也试过@arco444,但没有成功。
  • 如果使用$null会出现什么错误?
  • @arco444 我的搜索把我带到了这里。

标签: powershell scripting null


【解决方案1】:

这些是自动变量,例如$null$true$false 等。

about_Automatic_Variables,见https://technet.microsoft.com/en-us/library/hh847768.aspx?f=255&MSPPError=-2147217396

$NULL
$null 是一个包含 NULL 或空的自动变量 价值。您可以使用此变量来表示不存在或未定义 命令和脚本中的值。

Windows PowerShell 将$null 视为具有值的对象,即视为 一个显式占位符,因此您可以使用 $null 来表示一个空 一系列值中的值。

例如,当$null 包含在集合中时,它被计为 对象之一。

C:\PS> $a = ".dir", $null, ".pdf"
C:\PS> $a.count
3

如果将$null 变量通过管道传递给ForEach-Object cmdlet,它 为$null 生成一个值,就像它为其他对象生成的一样。

PS C:\ps-test> ".dir", $null, ".pdf" | Foreach {"Hello"}
Hello
Hello
Hello

因此,您不能使用$null 来表示“无参数值”。一种 $null 的参数值会覆盖默认参数值。

但是,因为 Windows PowerShell 将 $null 变量视为 占位符,您可以使用如下脚本,其中 如果$null 被忽略,将无法工作。

$calendar = @($null, $null, “Meeting”, $null, $null, “Team Lunch”, $null)
$days = Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
$currentDay = 0

foreach($day in $calendar)
{
    if($day –ne $null)
    {
        "Appointment on $($days[$currentDay]): $day"
    }

    $currentDay++
}

输出:

Appointment on Tuesday: Meeting
Appointment on Friday: Team lunch

【讨论】:

    【解决方案2】:

    使用$dec = $null

    来自documentation

    $null 是一个包含 NULL 或空值的自动变量。您可以使用此变量来表示命令和脚本中不存在或未定义的值。

    PowerShell 将 $null 视为具有值的对象,即作为显式占位符,因此您可以使用 $null 来表示一系列值中的空值。

    【讨论】:

      【解决方案3】:

      如果目标只是列出所有具有空描述属性的计算机对象,试试这个

      import-module activedirectory  
      $domain = "domain.example.com" 
      Get-ADComputer -Filter '*' -Properties Description | where { $_.Description -eq $null }
      

      【讨论】:

        【解决方案4】:

        正如其他人所说,使用$null

        但是,$null 的处理并不是那么简单。

        列表(或更准确地说,System.Array 对象)中,$null 在索引列表时被视为占位对象,因此($null, $null).count 输出@ 987654326@.
        但除此之外,$null 被视为一个标志,表示没有内容(没有对象;或者更准确地说,是.GetType() 报告的“空值表达式”),因此($null).count 输出0
        因此

        $null.count;  # Output = 0
        ($null).count;  # Output = 0
        (, $null).count;  # Output = 1
        ($null, $null).count;  # Output = 2
        ($null, $null, $null).count;  # Output = 3
        

        注意:在上述上下文中,.count.length 返回相同的输出。

        类似地,如果将上述任何一项显式分配给变量,如

        $aaa = $null;  $aaa.count
        $bbb = ($null, $null);  $bbb.count
        

        分别输出02

        ForEach 循环类似,如

        $aaa = $null;  ForEach ($a in $aaa) {write-host "Foo" -NoNewLine}
        $bbb = ($null, $null);  ForEach ($b in $bbb) {write-host "Bar" -NoNewLine}
        

        分别输出nothingBarBar

        但是,请注意在对已从列表返回的单个项目进行操作时 $null 再次被视为“空值表达式”,可以通过运行确认

        $xxx = ($null, "foo", $null);  ForEach ($x in $xxx) {write-host "C=" $x.count "| " -NoNewLine}
        

        输出C= 0 | C= 1 | C= 0 |

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-28
          • 2021-06-12
          • 1970-01-01
          • 1970-01-01
          • 2022-06-11
          • 1970-01-01
          相关资源
          最近更新 更多