Powershell 使用新变量函数创建变量时,如何显式声明变量的类型?
如何将Powershell 使用新变量函数创建变量时,如何显式声明变量的类型?,powershell,Powershell,如何将myChar中的New Variable-Name myChar-Value“=”-Option ReadOnly转换为type[char],或者(更一般地说)如何指定使用新变量创建的变量的类型 谢谢 编辑(计入@veefu): 编辑(贷记到@postanote): 没有单独使用cmdlet按照其规范执行此操作的本机方法: 变量类型 通常,在创建变量时,会根据使用的值隐式设置类型。尽管有时您可能希望显式设置变量类型 如果不为变量指定类型,可以执行以下操作: PS> $x = 35
myChar
中的New Variable-Name myChar-Value“=”-Option ReadOnly
转换为type[char]
,或者(更一般地说)如何指定使用新变量创建的变量的类型
谢谢
编辑(计入@veefu):
编辑(贷记到@postanote):
没有单独使用cmdlet按照其规范执行此操作的本机方法:
变量类型
通常,在创建变量时,会根据使用的值隐式设置类型。尽管有时您可能希望显式设置变量类型
如果不为变量指定类型,可以执行以下操作:
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
使用新变量时无法提供类型,因此如果需要只读或常量变量,请按上图所示创建该变量,然后使用Set Variable将其设置为只读或常量。
所以,这还是回到我之前的陈述
可以在创建后应用数据类型
在我之前的文章中,我没有想到Set变量。有类型说明符的变量与没有类型说明符的变量的区别在于变量属性:
[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 : {}
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
新变量
不支持设置这些属性,因此无法使用新变量
可以使用.net[psvariable]::new()
构造函数创建具有这些属性的变量。我不知道如何从头开始构造属性,使其与[int32]
等效,但在构造过程中能够成功地从另一个变量复制属性:
[int32] $int32ConstrainedVar1 = 32
$var1Attributes = (Get-Variable -Name 'int32ConstrainedVar1').Attributes
$newConstrainedVar = [psvariable]::new('int32ConstrainedVar2', 33, 'None', $var1Attributes)
在此之后,尝试分配无法转换为[int32]
的内容失败,正如预期的那样:
$newConstrainedVar.Value = 'asdf'
收益率:
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 : {}
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中以如此低的a级别工作的唯一原因是,如果您正在编写一个从另一种语言转换到powershell的运行时。这在powershell中几乎不可能做到,因此我已经提出了一个问题来解决这个问题 在[char](新变量-名称myChar-Value“=”
之后,可以为myChar分配一个非字符值:$myChar=[int32]8
,这会更改值的基本类型。当应用[char]
时,此赋值会引发异常。但您的示例是只读的,因此对其所做的任何更改都将被设计拒绝。我留下了我的例子,以便我可以删除它。我所提供的只是一种方法。请使用另一个查看我的更新。同样,仍然不能单独使用新变量设置类型。因此,查看变通方法是您唯一的选择。“我不知道如何从头开始构造属性”应该在将来解决这个问题,了解这个属性类的定义是非常有用的。是属性的主要创建者。目前,通过调用表达式编译文本[typename]$variableName
是创建转换属性的唯一方法;但也许有一些.net魔法我不知道。有趣的是,ArgumentTypeConverterAttribute
的构造函数采用了一个类型数组。在内部,可以定义具有多个类型转换的PSVariable,并且尝试将它们全部转换的逻辑似乎已经就绪。不过,编译器代码只使用单一类型进行初始化。类似于[int32,string]$var
的东西可能在某个时候被考虑过。
$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