PowerShell Get-VHD“不是现有的虚拟硬盘文件”

2024-05-24

在 Hyper-V 中创建新 VM 时,为了使事情井井有条,我在创建关联的 VHDX 文件时使用特定的命名约定。命名约定是 VM FQDN,后跟 SCSI 控制器连接点,后跟 VM 内部的驱动器名称或使用名称。我将 SCSI 和 Name 参数分别封装在圆括号和方括号内。我发现从人的角度来看,这往往会使事情变得更容易,将 Hyper-V 中的 VHDX 文件与需要执行维护任务时虚拟机内部看到的文件进行匹配。它在过去也有助于编写脚本。示例文件名如下所示...

servername.example.com(0-0)[OS].vhdx

这在相当长的一段时间内一直运行良好,但最近我尝试对 VHDX 文件运行一些 PowerShell 命令并遇到了问题。显然,内部 VM 名称的方括号被解析为 RegEx 或 PowerShell commandlet 内部的某些内容(老实说,我只是猜测这一点)。当我尝试对具有上述命名约定的文件使用 Get-VHD 时,它会抛出如下错误:

Get-VHD : 'E:\Hyper-V\servername.example.com\Virtual Hard Disks\servername.example.com(0-0)[OS].vhdx' is not an existing virtual hard disk file.
At line:1 char:12
+ $VhdPath | Get-VHD
+            ~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-VHD], VirtualizationException
    + FullyQualifiedErrorId : InvalidParameter,Microsoft.Vhd.PowerShell.Cmdlets.GetVHD

如果我只是重命名 VHDX 文件以排除命名约定的“[OS]”部分,则该命令可以正常工作。 SCSI 连接点的光滑支架似乎并没有打扰它。我尝试执行替换命令以在括号前面添加反引号“`”以转义它们,但会产生相同的错误。我还尝试过双反引号,看看传入反引号是否有帮助......这至少在它吐出的错误中显示了一个反引号。怀疑正则表达式,我也尝试将反斜杠作为转义字符...这具有将文件路径中的所有反斜杠转换为错误消息中的双反斜杠的有趣效果。我尝试通过单引号和双引号定义路径变量,但没有成功。我还尝试了几种通过管道获取它的不同方法,例如这个例子......

((Get-VM $ComputerName).HardDrives | Select -First 1).Path | Get-VHD

而且,就其价值而言,我尝试处理的虚拟机数量一样多......我需要能够通过管道或其他一些自动化脚本方法来运行它,而不是手动编码对每个 VHDX 文件的引用。

仍然认为这可能是 RegEx 的问题,我尝试使用以下命令转义变量字符串,但无济于事:

$VhdPathEscaped = [System.Text.RegularExpressions.Regex]::Escape($VhdPath)

坦白说,我没有想法。

当我第一次遇到这个问题时,我尝试使用 PowerShell 压缩 VHDX 文件。但是,由于我正在使用的单个虚拟机无论如何都需要离线才能运行该功能,所以我只是将其重命名、压缩,然后将名称重置回来,而不是使用 VHDX 名称来解决错误。然而,对于我现在尝试做的工作,我无法让虚拟机脱机,因为该脚本将针对整个实时虚拟机群运行。因此,我需要知道如何正确转义这些字符,以便 Get-VHD commandlet 接受这些文件名。


tl;dr:

  • A 设计限制 of Get-VHD https://learn.microsoft.com/en-us/powershell/module/hyper-v/get-vhd阻止它正确识别 VHD包含的路径[ and ](有关详细信息,请参阅底部部分)。

  • 解决方法:使用short(8.3) 文件路径假设文件系统支持它们:

$fso = New-Object -ComObject Scripting.FileSystemObject

$VhdPath | 
  ForEach-Object { $fso.GetFile((Convert-Path -LiteralPath $_)) } | 
    Get-VHD
  • 否则,您唯一的选择是(正如您所报告的,在您的情况下,VHD 位于ReFS文件系统 https://en.wikipedia.org/wiki/ReFS,这确实not支持短名称):

    • Rename你的文件(和文件夹,如果适用)不包含[ or ].

    • 或者,如果您可以假设您的 VHD 是连接到虚拟机,您可以提供VM兴趣的 VHD 作为输入附加到Get-VHD, via Get-VM https://learn.microsoft.com/en-us/powershell/module/hyper-v/get-vm(您可能必须将输出过滤为仅包含感兴趣的 VHD):

      (Get-VM $vmName).Id | Get-VHD
      

背景资料:

看起来像Get-VHD https://learn.microsoft.com/en-us/powershell/module/hyper-v/get-vhd只有一个-Path范围,不也是一个-LiteralPath参数,看起来像是一个设计缺陷:

Having both参数通常用于文件处理 cmdlet(例如Get-ChildItem):

  • -Path接受通配符表达式 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Wildcards通过 a 匹配可能的多个文件pattern.

  • -LiteralPath用于传递literal(逐字)路径,按原样使用。

What you have is a literal path that happens to look like a wildcard expression, due to use of metacharacters [ and ]. In wildcard contexts, these metacharacter must normally be escaped - as `[ and `] - in order to be treated as literals, which the following (regex-based) -replace https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Comparison_Operators#replacement-operator operation ensures[1] (even with arrays as input).

  • 不幸的是,这appears not足以Get-VHD.(尽管您可以通过管道来验证它原则上是否有效Get-Item相反,它也绑定到-Path).

    • Even double `- 转义(-replace '[][]', '``$&')不起作用(这是 - 在某些情况下意外需要 - 请参阅GitHub 问题 #7999 https://github.com/PowerShell/PowerShell/issues/7999).
# !! SHOULD work, but DOES NOT
# !! Ditto for -replace '[][]', '``$&'
$VhdPath -replace '[][]', '`$&' | Get-VHD

Note: Normally, a robust way to ensure that a cmdlet's -LiteralPath parameter is bound by pipeline input is to pipe the output from Get-ChildItem or Get-Item to it.[2] Given that Get-VHD lacks -LiteralPath, this is not an option, however:

# !! DOES NOT HELP, because Get-VHD has no -LiteralPath parameter.
Get-Item -LiteralPath $VhdPath | Get-VHD

[1] See this regex101.com page https://regex101.com/r/OxqUnx/1 for an explanation of the regex ($0 is an alias of $& and refers to the text captured by the match at hand, i.e. either [ or ]). Alternatively, you could pass all paths individually to the [WildcardPattern]::Escape() method (e.g., [WildcardPattern]::Escape('a[0].txt') yields a`[0`].txt.

[2] See this answer https://stackoverflow.com/a/60177977/45375 for the specifics of how this binding, which happens via the provider-supplied .PSPath property, works.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PowerShell Get-VHD“不是现有的虚拟硬盘文件” 的相关文章

随机推荐

  • nginx + php-fpm = 找不到文件

    当我尝试访问时info php我得到一个File not found error 我尝试了一些教程但无济于事 配置 默认 server listen 80 listen 80 default ipv6only on server name
  • 从 Azure 密钥保管库存储和检索 JKS

    我想引用 Azure Key Vault 中的 Java 密钥存储 而不是将其与作为 docker 映像部署到 Kubernetes 集群中的 Spring Boot 应用程序打包在一起 根据 Azure 文档 仅允许将 PFX 文件导入到
  • 停止引导程序轮播在幻灯片末尾循环

    我想要这样 当我按下轮播上的下一个按钮时 如果它已到达幻灯片的末尾 则不要绕回并返回到第一张幻灯片 Bootstrap 3 有没有简单的方法可以做到这一点 设置wrap选项为 false 会使轮播自动停止循环 myCarousel caro
  • 如何使用复选框来过滤 Angular 的结果?

    我正在尝试使用复选框应用过滤器 复选框正确显示 div div
  • 如何在运行时向 TypeDescriptor 添加属性级 Attribute?

    我想向对象的属性添加一些自定义的以 PropertyGrid 为中心的属性 以提供更丰富的编辑 隐藏一些值并将它们分组到类别中 因为我正在使用的那个类不提供此类功能 我无能为力关于它 实际上 它是为 MS 的应用程序设置生成代码的 因此您无
  • 使用 R 进行语言相关排序

    1 如何正确排序 任务是根据英文字母对美国州名缩写进行排序 但我注意到 R 根据某种操作系统语言或区域设置对列表进行排序 例如 在我的语言 立陶宛语 中 甚至拉丁语 非立陶宛语 字母的顺序也与英语字母表中的顺序不同 仅比较两个字母表中的非立
  • 如何延迟加载与 p:Tab 中包含的页面关联的 ManagedBean,仅当 Tab 打开时

    我有一个p tabView or p accordionPanel和 Facelets 包含在每个p tab using ui include 我的问题是与每个包含的页面关联的 ManagedBeans 在启动时初始化 我怎样才能使它们仅在
  • 用javascript检查瑞典语字符?

    如何重写此代码以检查所有字符 包括瑞典语 和 字符 alphaExp a zA Z 以上仅检查英文字母 瑞典语在 Z 之后包含 其余部分与英语相同 Thanks 你试过了吗 a zA Z 在我的火狐浏览器中 a zA Z test 评估为真
  • 在 JellyBean 上使用 LogCat

    我有一个非常随机发生的错误 所以我依赖LogCat我从 Play 商店购买的监控应用程序 以查看发生时设备上抛出的异常 自从使用 Jelly Bean 以来 我没有看到任何日志记录 我读过 使用 Jelly Bean 应用程序只能看到Log
  • 核心蓝牙和后台:检测设备并触发操作,即使在后台模式几天后?

    我编写了一个应用程序 需要在某个低功耗蓝牙设备进入范围内时收到通知 如果 BLE 设备被注意到 我的应用程序只会存储一个时间戳 正如 WWDC 2012 核心蓝牙视频中所述 使用核心蓝牙时 应用程序有两种在后台模式下运行的可能性 活动背景
  • spring oauth2授权代码流程,VK(Vkontakte)的配置

    我使用社交网络 Vkontakte 作为 Oauth2 授权服务器 所以我有几个步骤 1 通过请求获取代码请求类型 代码2 当我发送请求访问令牌uri时获取accessToken 所以我想使用 Spring Oauth2 但我应该首先获取授
  • 如何从 Angular 计时器获取当前时间

    我正在测试角度计时器 http siddii github io angular timer 并且发现自己想知道如何在控制器中获取当前时间 以便将其用于我可能有的任何目的 例如 我想当达到特定的分钟数时 将计时器的字体颜色设置为红色 但我完
  • 生成Mst响应工具

    我正在尝试使用 C 创建一个工具来获取通过单击 msi Windows 安装程序 的对话框生成的属性 我可以通过在 msi 关闭之前读取 property 表来获取最终的 msi 属性 但这包含相当多的不需要的属性 例如目录等 我希望能够做
  • 是否应该使用箭头函数创建类方法

    在创建 React 组件时 我有时会在网络上使用箭头函数语法创建方法 有时则不使用箭头函数语法 例如 class Component extends someFnk param gt vs class Component extends s
  • MySQL ifnull 相当于 php

    我的场景 exTime get cfg var session gc maxlifetime get cfg var session gc maxlifetime 1440 我希望它像 mysql 一样 exTime isnull get
  • IDEA 11.1.4 中的 Glassfish 3.1.2.2:“PWC6345:调用 javac 时出错。需要完整的 JDK(不仅仅是 JRE)”

    我正在尝试在新安装的 IDEA 11 1 4 Ultimate Windows 7 和新解压的 Glassfish 3 1 2 2 下启动并运行我们的 Mavenized Web 应用程序 我在 Eclipse 中做过很多次 但对 IDEA
  • Flutter ListView 未更新

    我想在 Flutter 中创建一个 ListView 当新数据到达时它会更新 我正在使用 RefreshIndicator 来触发列表加载以进行测试 对于我的列表 我使用 ListBuilder 将对象映射到视图对象 据我了解 setSta
  • 如何添加从 Outlook 到 Web 表单的拖放上传功能?

    我正在寻找一种方法 允许用户以简单的方式将 Outlook 电子邮件上传到基于 Web 的系统 我可以让它以手动方式为用户工作 他们可以将电子邮件从 Outlook 拖放到桌面上 这会创建一个 msg 文件 这非常有效 尤其是 电子邮件中是
  • aerospike:删除集合中的所有记录

    我正在使用 Aerospike 进行测试 我使用的是社区版 集群有2个节点 我使用存储引擎作为带有 SSD 的设备 我的配置文件 namespace test replication factor 2 memory size 16G def
  • PowerShell Get-VHD“不是现有的虚拟硬盘文件”

    在 Hyper V 中创建新 VM 时 为了使事情井井有条 我在创建关联的 VHDX 文件时使用特定的命名约定 命名约定是 VM FQDN 后跟 SCSI 控制器连接点 后跟 VM 内部的驱动器名称或使用名称 我将 SCSI 和 Name