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

时间:2018-01-05 16:07:14

标签: powershell variable-assignment powershell-v5.0

这是一个理解的问题。

我使用字符串变量$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 = ...是一个“新的”分配,并且应该具有指定值的类型 - 至少在我的眼睛。在我到目前为止使用的语言中,变量成为其值的类型,并且不会转换为变量先前的类型,或者我定义变量的类型,如果分配了错误的类型,则会收到错误。

我的逻辑错误在哪里?

1 个答案:

答案 0 :(得分:2)

我认为在您的代码中的某个位置,您对[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]类型..那么它会直接接受,甚至接受一个字符串。你只需要稍微修改你的代码来处理它。