如何在PowerShell中使用唯一的卷ID ReadAllByte?

时间:2016-10-16 10:49:33

标签: .net powershell powershell-v3.0 powershell-v4.0

我试过这个命令,它运行正常:

$path = "C:\sometext.txt"
[System.IO.File]::ReadAllBytes("$path")

但是当我尝试使用像这段代码的唯一ID读取PowerShell中文件的所有字节时,它不起作用:

$path =  "\\.\Volume{3386ab07-0000-0000-0000-501f00000000}\sometext.txt"
[System.IO.File]::ReadAllBytes("$path")

我使用唯一ID:

$listdrive = ""
$drivelistuniqueID = Get-Volume 
foreach ($item in $drivelistuniqueID)
{
    $listdrive += $item.UniqueId + "DriveLetterSplIttEr"
}
$listdrive=$listdrive.Replace("?",".")
$listdrive

如果我不将?替换为. PowerShell说:

Exception calling "ReadAllBytes" with "1" argument(s): "Illegal characters in
path."
At line:3 char:1
+ [System.IO.File]::ReadAllBytes("$path")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentException

有关如何解决此错误的任何想法? 我只需要使用GUID(唯一ID)读取文件。

2 个答案:

答案 0 :(得分:0)

您在那里混合文件和设备namespaces,我甚至不确定System.IO.File方法是否支持命名空间路径。无论如何你想要实现什么?如果要从已安装的卷读取文件,则应执行以下操作:

$guid  = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
$drive = (Get-Volume | Where-Object {$_.ObjectId -like "*$guid*"}).DriveLetter
$path  = Join-Path "${drive}:" 'sometext.txt'

$data = [IO.File]::ReadAllBytes($path)

如果驱动器尚未安装,则可能需要先安装它。

Get-Volume |
  Where-Object {$_.ObjectId -like "*$guid*"} |
  Get-Partition |
  Set-Partition -NewDriveLetter X

我认为您无法通过System.IO.File在未安装的卷上访问文件。

答案 1 :(得分:0)

实际上当你想要读取所有字节时,你可以直接进行。在您的计算机上测试这个使用GUID创建新文件然后尝试打开文件。你会发现你不能。如果你想使用readallbyte,你应该挂钩。