gpt4 book ai didi

powershell - 将变量串在一起以清除它们是否可以?

转载 作者:行者123 更新时间:2023-12-03 00:42:15 25 4
gpt4 key购买 nike

因此,可以使用 Clear-Variable cmdlet清除变量,该变量与为其赋予值$null相同。

也可以使用 Remove-Variable cmdlet或 Remove-Item cmdlet删除环境变量的变量。

我的问题是,是像这样将变量串在一起吗...

$Env:var1 = $var2 = $var3 = $null

...清除变量甚至分配值的合法方法?

我知道如果您分配这样的值 $var1$var2就独立于 $var1 = $var2 = 1,但是当该值是使用 New-Object cmdlet创建的对象时,两个变量都指向同一对象:
$var1 = $var2 = New-Object System.Diagnostics.Stopwatch
$var1.Start()
Start-Sleep 1
$var2.Stop()
Start-Sleep 1
$var1.Elapsed.TotalMilliseconds

这是否仅是 Microsoft .NET FrameworkCOM object的值?

最佳答案

... a legitimate way of clearing variables



是的,类似于 $var1 = $var2 = $null (仅使用2个变量作为示例)是一种 清除变量值的合法方法,提供的目标变量实际上是在本地(当前)范围内定义的。

如果仅在父(祖先)范围内可见,则将无意中创建名称相同的局部变量,其值为 $null-请参见 this answer

原则上,这也适用于 Clear-Variable var1, var2 ,不同之处在于,如果未定义本地变量 $var1$var2,它将发出错误;另外, Clear-Variable允许使用 -Scope显式地定位不同的范围。

由于存在限制,您还可以使用范围指定符(例如 $script:var-请参见 this related answer)将其他范围与变量赋值作为目标。

Remove-Variable 的行为类似于 Clear-Variable,并且还支持 -Scope,但实际上从隐含或目标作用域中删除(未定义)变量。

请注意,默认情况下访问已删除/不存在的变量实际上与访问值为 $null的现有变量相同。
但是,实际上,使用 Set-StrictMode -Version 1或更高版本时,访问不存在的变量在设计上会失败。

$var1 = $var2 = $null 相比, Clear-Variable var1, var2具有以下优点:
  • 它更简洁,也更快(不需要cmdlet调用)。
  • 可用于使用$null值隐式创建变量,或者换句话说,如果其中一个变量不存在,则语句不会失败。
  • 它也可以与环境变量(例如$env:FOO)一起使用,但是请注意,将$null(或'',空字符串)分配给环境变量实际上会删除它们($env:FOO = $null等效于Remove-Item Env:FOO)。

  • 警告:

    分配$null或调用Clear-Variable不一定会导致包含$null的变量:

    变量可能是类型受限的,在这种情况下,它们仅允许存储在创建(初始化)时锁定的类型的值:
    [int] $i = 1  # Create a type-constrained variable that can only store [int] values.

    当您将$null分配给类型受限的变量时,PowerShell会尝试将$null转换为锁定类型,这可能会有两个结果:
  • 转换成功,在这种情况下,锁定类型的转换值是新值。例如,对于[int],该值为0,因为[int] $null0
    [int] $i = 1; $i = $null; $i # -> 0, not $null
  • 转换可能会失败,从而导致错误;对于[datetime],转换失败,因为[datetime] $null失败。
    # !! ERROR: Cannot convert null to type "System.DateTime"
    [datetime] $dt = Get-Date; $dt = $null


  • 至于New-Object,并为多个变量分配非null值:

    如评论中所述,最终行为归结为是否分配了value-type实例或reference-type实例[1]:
  • 在使用值类型实例的情况下,每个变量都会获得其自己的值的独立副本。
    # A value-type instance such as an [int] instance assigns
    # *independent copies* of itself to the target variable(s):
    $var1 = $var2 = 42; $var2 = 43; $var1, $var2 # -> 42, 43
  • 对于引用类型的实例,所有变量都真正引用同一对象。
    # A reference-type instance such as a [hashtable] instance assigns
    # a *reference to itself* to the target variable(s), which therefore
    # all reference the same object.
    $var1 = $var2 = @{one=1}; $var2.one = 2; $var1.one, $var2.one # -> 2, 2

  • 请注意, [string]实例是的异常(exception):[string]从技术上讲是一种引用类型,但是具有值类型的语义,以便提供更直观的字符串处理-请参见this answer

    New-Object 可以实例化这两种类型:如果给它指定值类型的名称,则会得到一个值类型实例;给定引用类型的名称,您将获得一个引用类型实例。

    但是,鉴于内置值类型可以使用文字(例如1)或简单的强制类型转换([int])进行实例化,因此New-Object更通常用于实例化引用类型。

    [1]给定一个类型或实例,您可以检查该类型的.IsValueType属性以确定它是否是值类型;例如,因为[int](System.Int32)是值类型[int].IsValueType,而(1).GetType().IsValueType产生$true,而[System.IO.FileInfo].IsValueType$false,因为后者是引用类型。

    关于powershell - 将变量串在一起以清除它们是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58569555/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com