使用New-Variable函数创建变量时如何显式声明变量的类型?

时间:2018-08-18 05:01:57

标签: powershell

如何在timeout = aiohttp.ClientTimeout(total=60) connector = aiohttp.TCPConnector(limit=40) dummy_jar = aiohttp.DummyCookieJar() async with aiohttp.ClientSession(connector=connector, timeout=timeout, cookie_jar=dummy_jar) as session: for site in sites: task = asyncio.ensure_future(make_request(session, site, connection_pool)) tasks.append(task) await asyncio.wait(tasks) connection_pool.close() 中将myChar转换为类型New-Variable -Name myChar -Value "=" -Option ReadOnly,或者(更一般而言)如何指定使用[char]创建的变量的类型?

谢谢

编辑(贷记到@veefu):

New-Variable

编辑(贷记到@postanote):

[char]$sampleVariable="A"
$sampleAttributes=(Get-Variable -Name sampleVariable).Attributes[0]
New-Variable -Name myVariable
(Get-Variable -Name myVariable).Attributes.Add($sampleAttributes)
$myVariable="ab" # GENERATES CONVERSION ERROR (WHICH HELPS A LOT)
$myVariable="a"  # DOES NOT GENERATE CONVERSION ERROR (EVERYTHING'S FINE)

3 个答案:

答案 0 :(得分:3)

现在在PowerShell中几乎不可能做到这一点,因此我打开了一个问题You should be able to set the type conversion attribute on a variable with New-Variable来解决此问题。

答案 1 :(得分:2)

按照其规范,没有一种单独使用cmdlet的本地方法:

  

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/new-variable?view=powershell-6

[-Name] <String>
[[-Value] <Object>]
[-Description <String>]
[-Option <ScopedItemOptions>]
[-Visibility <SessionStateEntryVisibility>]
[-Force]
[-PassThru]
[-Scope <String>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]

稍作考虑后,可以在创建或内联之后应用数据类型,这种方式... (相对于您的用例而言,这可能是您的一种方式,但是再次……)

[char](New-Variable -Name myChar -Value "=")
$myChar
=
$myChar.GetType()
IsPublic IsSerial Name      BaseType
-------- -------- ----      --------
True     True     String    System.Object   

Remove-Variable -Name myChar

[int](New-Variable -Name myChar -Value 1)
0
$myChar
1
$myChar.GetType()
IsPublic IsSerial Name      BaseType
-------- -------- ----      --------
True     True     Int32     System.ValueType

Remove-Variable -Name myChar

[decimal](New-Variable -Name myChar -Value 10.00)
0
$myChar
10.00
$myChar.GetType()
IsPublic IsSerial Name      BaseType
-------- -------- ----      --------
True     True     Double    System.ValueType

Remove-Variable -Name myChar

变量类型

通常,当您创建变量时,将根据您使用的值隐式设置类型。有时,尽管您可能想显式设置变量类型。

如果您不给变量指定类型,则可以执行以下操作:

PS> $x = 35
PS> $x
35
PS> $x = 'now a string'
PS> $x
now a string

如果为变量指定显式类型

PS> [int]$x = 35
PS> $x
35
PS> $x = 'now a string'
Cannot convert value "now a string" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:1
+ $x = 'now a string'
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException

该变量需要一个整数或可以转换为整数的内容

PS> $x = '123'
PS> $x
123

使用New-Variable时无法提供类型,因此,如果需要只读或常量变量,则按上图所示创建它,然后使用Set-Variable将其设置为只读或常量

https://blogs.msmvps.com/richardsiddaway/2018/08/18/variable-type

所以,这仍然回到我之前的声明中...

  

创建后可以应用数据类型...

在我之前的帖子中没有想到Set-Variable。

答案 2 :(得分:2)

带有和不带有类型说明符[int32]的变量之间的区别在于变量属性:

[int32] $var1 = 32
$var2 = 'a'

Get-Variable -Name 'var1' | fl *
Get-Variable -Name 'var2' | fl *

产量:

Name        : var1
Description :
Value       : 32
Visibility  : Public
Module      :
ModuleName  :
Options     : None
Attributes  : {System.Management.Automation.ArgumentTypeConverterAttribute}

Name        : var2
Description :
Value       : a
Visibility  : Public
Module      :
ModuleName  :
Options     : None
Attributes  : {}

New-Variable不支持设置这些属性,因此无法使用[int32] $myVarname来等效于New-Variable

可以使用.net [psvariable]::new()构造函数来创建具有这些属性的变量。我无法弄清楚如何从头开始构造属性以使其等同于[int32],但是在构造过程中能够成功地从另一个变量复制属性:

[int32] $int32ConstrainedVar1 = 32
$var1Attributes = (Get-Variable -Name 'int32ConstrainedVar1').Attributes
$newConstrainedVar = [psvariable]::new('int32ConstrainedVar2', 33, 'None', $var1Attributes)

此后,按预期尝试分配无法转换为[int32]的内容失败:

$newConstrainedVar.Value = 'asdf'

产量:

Exception setting "Value": "Cannot convert value "asdf" to type "System.Int32". Error: "Input string was not in a correct format.""
At line:1 char:1
+ $newConstrainedVar.Value = 'asdf'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
+ FullyQualifiedErrorId : ExceptionWhenSetting

很抱歉,提供的详细信息;这是我刚接触到的Powershell内部构件级别。

我对您的用例感兴趣;我能想象出您想在如此低的水平上使用powershell的原因是,如果您正在编写一个将另一种语言转换为powershell的运行时。