PowerShell中Get-ChildItem使用含*的变量路径报错问题咨询
解决Get-ChildItem使用含通配符的变量路径时报错的问题
这个问题我之前也碰到过,其实核心原因是PowerShell解析变量中的通配符时的小坑:直接写带*的字符串路径时,PowerShell会自动把*识别为通配符;但把路径存入变量再传递时,若处理不当,解析器可能会把*当成路径的字面字符,从而抛出“路径中有非法字符”的错误。
给你几个可行的解决方案:
方案1:直接传递变量(去掉多余的双引号)
你原来的代码里给变量加了双引号"$PackagePath",其实完全没必要,直接传递变量名即可,PowerShell会正确解析其中的通配符:
$PackageName = "OrderAnalytics_EXTR.dtsx" $PackagePath = "\\pdw01rasci001\SSISPackages\PROD\Logs\exec_package_$($PackageName)*" $Files = Get-ChildItem $PackagePath # 这里不要加双引号
方案2:用Join-Path安全构建路径
用Join-Path命令来拼接路径和带通配符的文件名,能避免手动拼接时可能出现的解析问题,更可靠:
$PackageName = "OrderAnalytics_EXTR.dtsx" $BaseFolder = "\\pdw01rasci001\SSISPackages\PROD\Logs" $FileNamePattern = "exec_package_$PackageName*" $PackagePath = Join-Path -Path $BaseFolder -ChildPath $FileNamePattern $Files = Get-ChildItem -Path $PackagePath
方案3:把通配符单独放在参数里
如果觉得变量里带通配符不舒服,也可以把通配符移到Get-ChildItem的参数中,这样变量只存固定路径部分:
$PackageName = "OrderAnalytics_EXTR.dtsx" $BasePath = "\\pdw01rasci001\SSISPackages\PROD\Logs\exec_package_$PackageName" $Files = Get-ChildItem -Path "$BasePath*"
这些方法都能解决你遇到的“非法字符”错误,推荐用方案2,因为它的可读性和鲁棒性最好,尤其是在路径复杂或者有特殊字符的场景下。
内容的提问来源于stack exchange,提问作者Akash Paul
相关产品推荐
相关产品推荐

