这是一个理解的问题。
我使用字符串变量$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 = ...
是一个“新的”分配,并且应该具有指定值的类型 - 至少在我的眼睛。在我到目前为止使用的语言中,变量成为其值的类型,并且不会转换为变量先前的类型,或者我定义变量的类型,如果分配了错误的类型,则会收到错误。
我的逻辑错误在哪里?
答案 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]
类型..那么它会直接接受,甚至接受一个字符串。你只需要稍微修改你的代码来处理它。