在尝试使用 New-Item 创建新连接时,卷的唯一卷 ID 路径似乎已损坏;如何修复、绕过或解决?

问题描述 投票:0回答:1

我正在编写一个 PowerShell 脚本,在其中创建一个目录连接。

在脚本的开发过程中,我运行了 New-Item 命令,看到连接条目已创建,但没有仔细查看。事实证明,链接/交汇点是同时创建和损坏的,或者看起来是这样。这就是我的意思...

我想创建绝对连接(而不是相对连接),以便链接独立于分配的驱动器号。因此,我使用 mountvol 报告的卷 ID 及其 PS 对应的 Get-Volume 以及一些较小的 PS 体操(仍在学习 PS)。该脚本需要引用当前分配的驱动器号来获取卷 ID。

(Get-Volume | Where-Object {$_.DriveLetter -eq 'c'}).Path

(Get-WmiObject win32_volume | Select-Object DriveLetter, DeviceID | Where-Object {$_.DriveLetter -eq 'c:' }).DeviceID

实现所需的体积路径(有细微的差别 - 请注意一个中的冒号,而另一个中缺少冒号)。我相信,所使用的点表示法仅适用于 PS 版本 3 及更高版本。

我可以挖掘的微软文档将这些描述为 “DOS 设备路径”

我真的不知道其中有多少是“DOS”,有多少是“Windows”,以及界限在哪里。我还知道 Windows 有一个带有 \DEVICE\HardDiskX 的磁盘引用架构...但是关于设备 cmdlet 的 PS 文档非常枯燥(尝试 get-help Get-NtDeviceProperty),我认为卷的设备路径将是一个设备属性,所以,无论如何,除了我已经知道它出现的地方(例如事件日志和磁盘部分)之外,我并没有遇到过这种表示法。

因此,继续使用可用的内容,通过上述 cmdlet 接收到 VolumeID 路径,无论您如何运行 New-Item cmdlet、管道、parantethicals 或直接提供volumeID 路径的字符串; New-Item 命令似乎破坏了“目标”或“值”:

\\?\Volume{aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee}\Some_Path

\??\\\?\Volume{aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee}\Some_Path

不知道发生了什么,也不知道为什么 New-Item 会这样,我尝试了以下操作(据我所知 - 尝试了一些事情):

  • 因为这是脚本的一小部分,并且还涉及其他变量和过程,所以我花了很多时间自上而下地单步执行代码,以查看其他元素(例如,Join-Path)是否损坏了原始卷ID路径,但事实证明这是这部分新项目的最后一步;
  • 我以为我只使用 mklink,在命令提示符下正常工作,但事实证明这是 Windows 命令 shell 的内置命令,在传统的 Windows 控制台/shell/命令提示符之外不可用。
  • 好的,然后只需从 PS 调用 cmd.exe 并运行 mklink 命令作为参数,使用 Start-Process 或 PoweShell Start-Process 以及 -Arguments 'mklink /j Link_path_and_name Link_path_and_target_using_volumeID_Path' 开关;不,只是呈现一个空白的黑色外壳,不对所提供的参数进行任何操作
  • 不记得我尝试过哪些其他具体解决方案,但我现在很困惑,并准备寻求一些新的眼光并思考解决方案。

我还能如何在 PowerShell 中使用或不使用 New-Item 来实现联结创建,这将使用上述可用的卷 ID 路径创建指向卷和该卷中独立于 Windows 分配的驱动器号的路径的绝对联结链接来自 mountvol 或 Get-Volume,甚至 \DEVICE\HARDDISKX\ 样式引用?非常感谢任何正确方向的想法和帮助。

提前致谢。

windows powershell scripting powershell-4.0 system-administration
1个回答
0
投票

参见:https://winaero.com/create-symbolic-link-windows-10-powershell/

mklink
cmd.exe
中的内置命令,不能直接在 PowerShell 中使用。但是,您可以使用
cmd /c mklink
从 PowerShell 调用它。

Get-ChildItem D:\MainFolder-Copy -Directory | Foreach {Get-ChildItem (Join-Path C:\MainFolder $_.Name) -Directory} | Foreach {cmd /c mklink /j ($_.FullName -replace 'C:\\MainFolder','D:MainFolder-Copy') $_.FullName}

或者在 PowerShell 中您可以使用

New-Item

New-Item -ItemType Junction -Path "Link" -Target "Target"

从 PowerShell 访问卷影复制 (VSS) 快照并使用卷号说明符创建连接:从 powershell 访问卷影复制 (VSS) 快照

$s1 = (Get-WmiObject -List Win32_ShadowCopy).Create ("C:\", "ClientAccessible")
$s2 = Get-WmiObject Win32_ShadowCopy | Where-Object { $_.ID -eq $s1.ShadowID }
$d = $s2.DeviceObject + "\"
cmd /c mklink /d C:shadowcopy "$d"
© www.soinside.com 2019 - 2024. All rights reserved.