【问题标题】:Powershell variable initialization affect function return?Powershell变量初始化影响函数返回?
【发布时间】:2020-10-22 03:45:14
【问题描述】:

今天我发现了非常奇怪的行为,对我来说没有任何逻辑。在我的一台机器上,这段代码按我的预期工作,但在另外两台机器上我重现了

function Set-XXX {param([String] $variableName) 
    [string]$vw;
    $vw = $variableName;
    return $vw;
}

当我执行这个函数时,我得到了 Object[] 的奇怪结果,而不是我预期的 string

PS C:\Users\Robert> $ve = Set-XXX -variableName "eeee"
PS C:\Users\Robert> $ve.GetType()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
PS C:\Users\Robert> $ve[0]
PS C:\Users\Robert> $ve[1]
eeee

当我用空字符串设置$vw 时:[string]$vw = '' 结果类型是string 并且没有问题。谁能解释一下为什么会这样?

PS C:\Users\Robert> function Set-XXX {param([String] $variableName)
>>     [string]$vw= '';
>>     $vw = $variableName;
>>     return $vw;
>> }
PS C:\Users\Robert> $vex = Set-XXX -variableName "eeee"
PS C:\Users\Robert> $vex
eeee
PS C:\Users\Robert> $vex.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object


PS C:\Users\Robert> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.19041.546
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.546
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

为什么 Powershell 不尊重变量声明 [string] 并试图返回 Object[]

【问题讨论】:

  • PowerShell 不像许多其他语言那样具有变量 declarations,因此:[string]$vw,被视为强制转换操作 - 如果 @987654332 将返回一个空字符串@ 尚未分配

标签: powershell initialization


【解决方案1】:

return 关键字在 PowerShell 中是多余的,函数内提供输出的任何内容都将由该函数返回。

因此,在您的函数中返回了两件事,首先是 $vw,当时是一个空字符串,然后是 $vw,现在又是一个值。

基本上你得到一个数组,因为你的函数返回两个对象/值。

尝试运行([string]$null).GetType(),您会看到一个空变量转换为字符串将返回一个空字符串。

删除

[string]$vw;

在函数中没有真正意义。

【讨论】:

  • 在更复杂的函数中,如何设置多区域访问的变量?我的意思是$someVar会在很多地方使用。
  • 您的意思是设置一个将在函数外部使用还是在函数内部的多个位置使用的变量?答案很可能已经在 Stack Overflow 上)。
  • 我的意思是我的变量只在函数中,但它可以在不同的代码位置初始化。我需要检查例如字符串是否被初始化,如果没有做一些额外的工作
  • 作为一个新问题提出来,我去看看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 2011-06-12
  • 1970-01-01
相关资源
最近更新 更多