【问题标题】:Powershell: Path as input parameter is cropped [duplicate]Powershell:作为输入参数的路径被裁剪[重复]
【发布时间】:2021-12-30 08:09:47
【问题描述】:

我有一个我想通过命令行执行的 powershell 脚本。为此,我需要输入 xml 文件的路径。最好能说明问题。 Error: File not Found

我的所有文件都在同一个目录 C:\Users\fynne\test 中(原因是我正在为其编写此脚本的用户)但不知何故在加载 xml 时跳过了测试目录(C:\未找到用户\fynne\01-38-029.xml)。我不知道为什么会这样。
这就是我加载 xml 的方式。

$PatientA = $args[0]
$PatientB = $args[1]
$XmlA = New-Object System.XML.XMLDocument
$XmlA.Load($PatientA)
$XmlB = New-Object System.XML.XMLDocument
$XmlB.Load($PatientB)

有人知道原因并有解决办法吗?我知道我可以通过使用一些字符串操作和 $pwd 来修复它,但我宁愿不这样做。

谢谢

【问题讨论】:

  • $XmlA.Load((Resolve-Path $PatientA))
  • @MathiasR.Jessen IMO Convert-Path 是更好的选择,因为它还将 PSPath 转换为本地提供程序路径。比较 Resolve-Path ((Get-Item .).PSPath)Convert-Path ((Get-Item .).PSPath),前者输出的路径对于 .NET API 输入无效。我们也应该通过-LiteralPath 或者准备好可能得到一个路径数组。
  • @zett42 好点,我在下面的回答中包含了Convert-Path
  • 这能回答你的问题吗? How to access a PSDrive from System.IO.File calls? -- 问题有些不同,但答案也适用于当前问题。
  • 啊,现在我明白了。谢谢你们的帮助:)

标签: powershell input command-line parameters


【解决方案1】:

PowerShell 将尝试解析相对于当前提供程序位置的非绝对路径 - 但 .NET 方法(如 XmlDocument.Load())将相对于当前进程的工作目录解析它们。

您可以使用Convert-Path 手动将相对路径转换为绝对路径:

$PatientA,$PatientB = $args[0..1] |Convert-Path

$XmlA = New-Object System.XML.XMLDocument
$XmlA.Load($PatientA)
$XmlB = New-Object System.XML.XMLDocument
$XmlB.Load($PatientB)

如果您想尝试进一步验证路径,您还可以使用包含提供程序元数据的Resolve-Path

$PatientA = $args[0] |Resolve-Path
if($PatientA.Provider.Name -ne 'FileSystem'){
  throw 'First path was not a file system path...'
  return
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2013-10-07
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    相关资源
    最近更新 更多