Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 使用新变量函数创建变量时,如何显式声明变量的类型?_Powershell - Fatal编程技术网

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