Powershell 异常变量类型不匹配

Powershell 异常变量类型不匹配,powershell,type-conversion,number-literal,Powershell,Type Conversion,Number Literal,如果我运行命令: Resize-VHD -ComputerName $VMhost -Path "D:\VMs\$VMname\Virtual Hard Disks\$vmname.vhdx" -SizeBytes 70GB Powershell足够聪明,能够理解70GB是什么,接受该论点并调整驱动器大小 但是,如果我这样做: $drivesize = "70GB" Resize-VHD -ComputerName $VMhost -Path "D:\VMs\$VMname\Virtual

如果我运行命令:

Resize-VHD -ComputerName $VMhost -Path "D:\VMs\$VMname\Virtual Hard Disks\$vmname.vhdx" -SizeBytes 70GB
Powershell足够聪明,能够理解70GB是什么,接受该论点并调整驱动器大小

但是,如果我这样做:

$drivesize = "70GB"

Resize-VHD -ComputerName $VMhost -Path "D:\VMs\$VMname\Virtual Hard Disks\$vmname.vhdx" -SizeBytes $drivesize
我得到以下错误:

Resize-VHD : Cannot bind parameter 'SizeBytes'. Cannot convert value "70GB" to type "System.UInt64". Error: "Input string was 
not in a correct format."
At line:22 char:100
+ ... D:\VMs\$VMname\Virtual Hard Disks\$vmname.vhdx" -SizeBytes $drivesize
+                                                                ~~~~~~~~~~
+ CategoryInfo          : InvalidArgument: (:) [Resize-VHD], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.Vhd.PowerShell.Cmdlets.ResizeVhd
我认为这是一个变量类型的问题,错误说明了很多,我只是不知道如何修复它

编辑:

如果我将
$drivesize
的值写入控制台,我会得到:

PS C:\Windows\system32> $drivesize
70GB
而不是:

$drivesize = "70GB" # WRONG: Quoting creates a STRING, but you want a NUMBER
使用:

对于PowerShell,带有二进制乘数后缀(如
GB
的无引号数字标记是数字

请注意,结果数字的特定整数类型有所不同:使用的最小有符号整数类型等于或大于可适合该数字的
[int]
System.Int32
);e、 g,
1GB
创建一个
[int]
,而上面的示例,
70GB
,创建一个
[long]
System.Int64
)。
不过,通常情况下,您不必担心PowerShell中的特定数字类型,因为它们会根据需要相互转换

不要将此类令牌存储在字符串中;虽然PowerShell在将看起来像数字的字符串转换为实际数字时通常非常灵活,但它通常不会将
“70GB”
等字符串识别为数字-请参见下文


可选读取:对包含后缀为
GB的数字标记的字符串进行数字转换

也许令人惊讶的是,PowerShell的二进制乘法器后缀-
kb
mb
gb
tb
pb
-仅在数字文本中工作,而在从字符串(隐式)转换时不工作。

PS> 1gb  # produces an [int] whose value is equivalent to 1 * [math]::Pow(2, 30)
1073741824

PS> [int] '1gb' # !! From-string conversion FAILS
Cannot convert value "1gb" to type "System.Int32". Error: "Input string was not in a correct format."

# Workaround: Simply divide by 1, because PowerShell does
#             recognize the suffix in the context of an *expression*.
PS> '1gb' / 1
1073741824
为提供解决方法提供的提示。
在表达式中执行隐式到数字转换时识别后缀与在中讨论参数绑定时识别后缀之间惊人的差异

“从字符串转换”不起作用的原因是后缀是特定于PowerShell的,而将字符串转换为数字类型-无论是在参数绑定期间隐式转换还是使用强制转换(如
[int]
)显式转换-都使用不知道这些后缀的.NET方法

因此,使用一个表示相同值但没有乘数后缀的字符串可能会起作用,例如:

PS> $driveSize = '1073741824'; [UInt64] $driveSize
1073741824
虽然如果您事先知道该值,没有理由使用字符串开头,使用数字文字可以避免问题:

$driveSize = 70GB # creates a [long] (System.Int64) with value 75161927680
请注意,PowerShell通常会根据需要扩展数字类型(根据需要使用更大容量的类型),并自动执行有符号/无符号类型转换。

PS> 1gb  # produces an [int] whose value is equivalent to 1 * [math]::Pow(2, 30)
1073741824

PS> [int] '1gb' # !! From-string conversion FAILS
Cannot convert value "1gb" to type "System.Int32". Error: "Input string was not in a correct format."

# Workaround: Simply divide by 1, because PowerShell does
#             recognize the suffix in the context of an *expression*.
PS> '1gb' / 1
1073741824
因此,即使是基于上述语句键入的
$driveSize
System.Int64
,PowerShell在绑定到
SizeBytes
参数时会自动将其转换为
System.UInt64
(无符号)。

而不是:

$drivesize = "70GB" # WRONG: Quoting creates a STRING, but you want a NUMBER
使用:

对于PowerShell,带有二进制乘数后缀(如
GB
的无引号数字标记是数字

请注意,结果数字的特定整数类型有所不同:使用的最小有符号整数类型等于或大于可适合该数字的
[int]
System.Int32
);e、 g,
1GB
创建一个
[int]
,而上面的示例,
70GB
,创建一个
[long]
System.Int64
)。
不过,通常情况下,您不必担心PowerShell中的特定数字类型,因为它们会根据需要相互转换

不要将此类令牌存储在字符串中;虽然PowerShell在将看起来像数字的字符串转换为实际数字时通常非常灵活,但它通常不会将
“70GB”
等字符串识别为数字-请参见下文


可选读取:对包含后缀为
GB的数字标记的字符串进行数字转换

也许令人惊讶的是,PowerShell的二进制乘法器后缀-
kb
mb
gb
tb
pb
-仅在数字文本中工作,而在从字符串(隐式)转换时不工作。

PS> 1gb  # produces an [int] whose value is equivalent to 1 * [math]::Pow(2, 30)
1073741824

PS> [int] '1gb' # !! From-string conversion FAILS
Cannot convert value "1gb" to type "System.Int32". Error: "Input string was not in a correct format."

# Workaround: Simply divide by 1, because PowerShell does
#             recognize the suffix in the context of an *expression*.
PS> '1gb' / 1
1073741824
为提供解决方法提供的提示。
在表达式中执行隐式到数字转换时识别后缀与在中讨论参数绑定时识别后缀之间惊人的差异

“从字符串转换”不起作用的原因是后缀是特定于PowerShell的,而将字符串转换为数字类型-无论是在参数绑定期间隐式转换还是使用强制转换(如
[int]
)显式转换-都使用不知道这些后缀的.NET方法

因此,使用一个表示相同值但没有乘数后缀的字符串可能会起作用,例如:

PS> $driveSize = '1073741824'; [UInt64] $driveSize
1073741824
虽然如果您事先知道该值,没有理由使用字符串开头,使用数字文字可以避免问题:

$driveSize = 70GB # creates a [long] (System.Int64) with value 75161927680
请注意,PowerShell通常会根据需要扩展数字类型(根据需要使用更大容量的类型),并自动执行有符号/无符号类型转换。

PS> 1gb  # produces an [int] whose value is equivalent to 1 * [math]::Pow(2, 30)
1073741824

PS> [int] '1gb' # !! From-string conversion FAILS
Cannot convert value "1gb" to type "System.Int32". Error: "Input string was not in a correct format."

# Workaround: Simply divide by 1, because PowerShell does
#             recognize the suffix in the context of an *expression*.
PS> '1gb' / 1
1073741824

因此,即使是基于上述语句键入的
$driveSize
System.Int64
,PowerShell在绑定到
SizeBytes
参数时会自动将其转换为
System.UInt64
(未签名)。

是的,问题是引号。我去掉了那些,效果很好。是的,问题是引号。我去掉了那些,效果很好。