Powershell 中的变量类型与预期不符

Type of Variable not as expected in Powershell

这是理解的问题

我使用字符串变量 $path 构建目录结构。我附加了我要创建的目录的名称,这按预期工作。路径完成后,我需要完整的目录 System.IO.DirectoryInfo 但是以这种方式分配路径 $Path = Get-Item $Path 会导致字符串类型。

$path = "c:\dir1"
If(-Not (Test-Path $path))New-Item -ItemType Directory -Path $path
$path = $path + "\dir2"
If(-Not (Test-Path $path))New-Item -ItemType Directory -Path $path

# Assigned to same variable
$path = Get-Item $path
echo $path.GetType() # = string

# assigned to different variable
$p_a_t_h = Get-Item $path
echo $p_a_t_h.GetType() # = System.IO.DirectoryInfo

# solution but not understood the behavior
[System.IO.DirectoryInfo]$path = Get-Item $path
echo $path.GetType() # = System.IO.DirectoryInfo

我花了几个小时才找出这种行为,但我找不到任何文档说明这是为什么 - 可能是因为我不知道要搜索什么。

很明显,为了将某些内容附加到变量,变量的类型是相关的,但是 $path = ... 是一个 "new" 赋值并且应该具有赋值的类型 -至少在我眼里。到目前为止,在我使用的语言中,变量成为其值的类型,并且未转换为变量之前的类型,或者我定义了变量的类型,如果分配了错误的类型,则会出现错误。

我的逻辑错在哪里?

我认为您在代码中的某个地方对 [String] 进行了左侧转换(针对变量,而不是值),就像您稍后在示例中使用 [System.IO.DirectoryInfo]$path 所做的那样。

发生这种情况的最常见方式:参数。

这是从函数中提取的吗?喜欢:

function Invoke-MyThing {
param([String]$Path)

}

为什么这很重要

当您将类型放在变量上时,分配给该变量的所有值都会收到该类型。

[String]$Value = 'Hello'
$Value.GetType()

$Value = 3.141
$Value.GetType()

转换值只会影响那个值:

$V2 = 5
$V2.GetType()

$V2 = [String]9
$V2.GetType()

$V2 = 45
$V2.GetType()

因此,删除您之前的变量端转换,或者如果它是一个参数,只需使用不同的局部变量。

更好的是,如果它是一个参数,您可以将其改为 [System.IO.DirectoryInfo] 类型。然后它会直接接受它,甚至接受一个字符串。你只需要稍微修改你的代码来处理它。