【问题标题】:How do I get the drive letter for the ISO I mounted with Mount-DiskImage如何获取使用 Mount-DiskImage 挂载的 ISO 的驱动器号
【发布时间】:2022-05-17 01:19:15
【问题描述】:

我有一个通过Mount-DiskImage 命令安装的ISO。但是,我不知道如何获取已安装磁盘映像的驱动器号。我试试$mountResult = Mount-DiskImage D:\ISOs\clonezilla-live-1.2.12-10-i486.iso -PassThru。返回的信息都不是驱动器号,如下图:

PS C:\Windows\system32> $mountResult | fl *


Attached              : False
BlockSize             : 0
DevicePath            : 
FileSize              : 110100480
ImagePath             : D:\ISOs\clonezilla-live-1.2.12-10-i486.iso
LogicalSectorSize     : 2048
Number                : 
Size                  : 110100480
StorageType           : 1
PSComputerName        : 
CimClass              : ROOT/Microsoft/Windows/Storage:MSFT_DiskImage
CimInstanceProperties : {Attached, BlockSize, DevicePath, FileSize...}
CimSystemProperties   : Microsoft.Management.Infrastructure.CimSystemProperties

PS C:\Windows\system32> $mountResult | select -ExpandProperty CimSystemProperties | fl *


Namespace  : ROOT/Microsoft/Windows/Storage
ServerName : ECHO-BASE
ClassName  : MSFT_DiskImage
Path       : 

之后调用Get-DiskImageD:\ISOs\clonezilla-live-1.2.12-10-i486.iso也不返回驱动器号。

如何获取驱动器号?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    试试这个:

    $mountResult = Mount-DiskImage D:\ISOs\clonezilla-live-1.2.12-10-i486.iso -PassThru
    $mountResult | Get-Volume
    

    这将返回 ISO 分配到的驱动器号以及其他信息 - 从那里只需解析输出即可。

    编辑: 这将只返回驱动器号:

    $driveLetter = ($mountResult | Get-Volume).DriveLetter

    【讨论】:

    • @ParrotMac 你知道分配特定驱动器号的方法吗?
    • @Fnord 也许这会有所帮助?挂载,然后将结果与此一起使用:Change Drive Letters and Labels via a Simple PowerShell Command
    • 重要的是“-PassThru”参数。
    • 昨天刚刚更新了 Windows 10,我想知道行为是否发生了变化。这对我来说根本没有任何回报。 ISO 已挂载,我可以在 Explorer 中看到并访问它,但 $mountResult | Get-Volume 什么也不做。
    • 这里也一样。我的$mountResultMSFT_DiskImageGet-Volume 似乎不适用于此类。我对已安装的 VHDX 的 DeviceID 感兴趣。有人可以帮忙吗?
    【解决方案2】:

    我发现这行得通

    $beforeMount = (Get-Volume).DriveLetter
    
    $mountResult = Mount-DiskImage $imagePath
    
    $setuppath = (compare $beforeMount (Get-Volume).DriveLetter -PassThru) + ":\"
    

    【讨论】:

      【解决方案3】:

      仅供参考,我再次安装相同的图像时遇到问题,所以我做了一个小改动,如果没有安装,它会检查图像是否已经安装并给出卷。

      $ImagePath= " " ## Path of ISO image to be mounted 
      $ISODrive = (Get-DiskImage -ImagePath $ImagePath | Get-Volume).DriveLetter
      IF (!$ISODrive) {
      Mount-DiskImage -ImagePath $ImagePath -StorageType ISO
      }
      $ISODrive = (Get-DiskImage -ImagePath $ImagePath | Get-Volume).DriveLetter
      Write-Host ("ISO Drive is " + $ISODrive)
      

      【讨论】:

        【解决方案4】:

        嗯..为什么这么复杂?

        Mount-DiskImage D:\cd.iso -PassThru | Get-Volume
        

        【讨论】:

          【解决方案5】:

          我不完全确定它是否属于这里,但考虑到 我想说的问题和答案。

          斜体:从命令提示符复制。

          假设

          当我们谈论挂载时,我们通常会谈论挂载(虚拟)磁盘,我们有 DISKPART.EXE,或者像 .WIM 和 .SWM 这样的安装文件,我们有 DISM.EXE (IMAGEX.EXE),或者第三方软件,例如“NTLite”,或者它涉及 CD 和 DVD 映像,例如 .ISO。据我所知,.ISO 文件始终以只读方式安装,除非使用第三方软件。因此 .ISO 文件是最不灵活的文件,因此我写这篇文章的假设是当时提出的问题是为一个或多个复制命令、查找命令提供源文件的正确和完整路径,或读取命令,它们中的每一个都取决于源文件的明确定义路径,不一定是已安装映像的路径。

          一种可能的解决方案#

          c:\windows\system32>powershell.exe mount-diskimage -imagepath
          "d:\blah\vlah.iso" -confirm -passthru
          
          Attached           : True
          Blocksize          : 0
          Devicepath         : \\.\CDROM0 <<== Object of interest, since COPY.EXE
          Filesize           : 4586569728           won't recurse and XCOPY.EXE
          Imagepath          : "d:\blah\vlah.iso"   won't accept it as a valid 
          Logicalsectorsize  : 2048                 path, however ROBOCOPY.EXE
          Number             : 0                 will accept it and then it does 
          Size               : 4586569728        do what I demand of it, copy the  
          Storagetype        : 1                 contents of the  mounted .ISO
          Pscomputername     :
          
          xcopy \\.\CDROM0\*.* C:\new /h /i /c /k /e /r /y /f /b
          Invalid drive specification
          0 File(s) copied
          
          Robocopy \\.\CDROM0 C:\new /E /ZB /COPYALL /256 /R:3 /W:1 /X /V /TS  
          /FP /NP /ETA /LOG:w:\ROBO.LOG /TEE /NJH
          

          可以说,这种组合对于回答问题和解决问题都是最有效的,因为 POWERSHELL.EXE 不会打开“gui”,(因此所有反馈“stdout”和“stderr”,如果允许,将出现在一个窗口中),而它为我们提供了“标准输出”,这使得获取驱动器号的必要性对您的文件和/或命令来说是多余的和/或浪费时间。如果我是正确的,“设备路径”将始终相同,尽管我没有检查过,我不能说这是否仅在我的计算机上。

          关于通过 COMMAND PROPMT 使用 POWERSHELL.EXE 的问题

          虽然有一个问题,它可能是我的计算机,但最好重复 POWERSHELL.EXE 命令,因为我和我的批处理文件大多数时候 'Attached : False' 是结果第一次尝试,包括安装 (false) 和“卸载”图像 (true)。这将导致执行我或您的“批处理文件”时出现错误,类似于:'系统找不到指定的路径。'这将在另一个命令引用预期的那一刻之后发生“挂载点”和图像。

          附录 2017 年 2 月 5 日:我发现使用 \.\CDROMX 的解决方案似乎仅在添加 /256 时才有效,否则可能会失败并显示以下消息:

          2017/02/05 01:11:15 错误 53 (0x00000035) 访问源目录 \.\CDROM0\ 找不到网络路径。

          我希望这对人们有所帮助,这已经对我有所帮助,遵循记事本长行设置:72 在 stackoverflow 上创建了一个丑陋的布局。

          【讨论】:

            【解决方案6】:

            这对我有用:

            $beforeMount = (Get-Volume).DriveLetter
            $imagePath = 'C:\dsc\en_windows_server_2016_x64_dvd_9718492.iso'
            $mountResult = Mount-DiskImage $imagePath
            $afterMount = (Get-Volume).DriveLetter
            $setuppath = "$(($afterMount -join '').replace(($beforeMount -join ''), '')):\"
            

            【讨论】:

              【解决方案7】:

              我正在安装 VHD,但接受的答案无效。如果我通过几个额外的命令传递结果。

              $mountResult = Mount-DiskImage C:\some.VHD -PassThru
              ($mountResult | Get-Disk | Get-Partition | Get-Volume).DriveLetter
              

              我是 PowerShell 新手,所以我可能做错了什么,或者可能是因为我使用的是 VHD,而不是 ISO。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-11-05
                • 2010-10-23
                相关资源
                最近更新 更多