从PowerShell中的路径获取驱动器号

9
我希望能够使用PowerShell编写一个脚本,以便轻松地翻译像这样的路径:
H:\MyDoc.docx

将其转换为真正的绝对路径,像这样:

\\FileServer\UserShares\Organization\Department\Me\MyDoc.docx

在这种情况下,我在本地计算机上创建了一个网络驱动器映射,将H:\指向\\FileServer\UserShares\Organization\Department\Me\,但是我需要轻松扩展映射路径,以便与可能没有驱动器映射的其他用户共享它。
获取驱动器的路径很容易。
(Get-PSDrive H).DisplayRoot

然而,当我尝试编写更通用的脚本以自动适应可能指向其他映射驱动器(我有几个)的路径时,遇到了问题。 我很难弄清楚的是如何从给定的路径中仅提取驱动器号。
我认为 Split-Path 会有所帮助,但它似乎只能将路径分成块 - “Parent”和“Leaf” - 都不能仅给出驱动器号。
在PowerShell中,是否有一种方法可以仅从给定路径中获取驱动器号?
注意:我需要此方法适用于指向文件或文件夹的路径。
4个回答

19

从PowerShell 3.0开始,Split-Path现在提供了-Qualifier选项:

-Qualifier
   Indicates that this cmdlet returns only the qualifier of the specified path.
   For the FileSystem or registry providers, the qualifier is the drive of the
   provider path, such as C: or HKCU:.

使用 OP 的示例:

PS C:\> Split-Path -Path "H:\MyDoc.docx" -Qualifier

返回 H:


15
你可以使用FileInfo对象的PSDrive属性:
(Get-Item .\your\path\to\file.ext).PSDrive.Name

啊,所以我不是将字符串本身作为路径处理,而是使用该字符串通过 Get-ChildItem 获取实际对象,然后使用该对象的数据进行操作。我可以看到这对文件有效,但文件夹呢? - Iszi
1
实际上不是这样的,因为Get-ChildItem返回文件夹中所有对象而不是文件夹本身。将其替换为Get-Item,它将适用于文件和文件夹。 - Iszi
该方法的附加好处:也适用于相对路径! - Iszi
使用更整洁的版本:$f = get-item yourfile.txt; $f.fullname.trimstart((get-item $f).psdrive.name + ":")$f.fullname -ireplace "[a-z]:(.*)", '$1' - arco444
我想尝试类似这样的代码:$p=Read-Host; $d=(GI $p).PSDrive.Name; $t=(GI $p).FullName.TrimStart($x+':'); $n=(GDR $d).DisplayPath; ECHO "$n$t"; - Iszi
显示剩余3条评论

2

这是一个适用于大多数情况的解决方案,但它有点“hacky”,因为它只返回字符串的一部分,而不是文件路径的特定组件。


假设驱动器由单个字母表示(大多数情况下都是这样),您可以将路径作为字符串处理,而不是尝试将其视为多部分的“路径”对象来避免此问题。这使问题非常简单,因为驱动器号码始终位于字符串的第一个字符上,并且PowerShell将字符串处理为单个字符的数组。

例如,如果脚本将提供的路径存储在$MyPath中,那么获取驱动器号码的方式就是:

$DriveLetter = $MyPath[0]

2
((Get-Location).Path.Split(":")).Get(0)

Returns just the provider.  Output:

PS SQLSERVER:\> ((Get-Location).Path.Split(":")).Get(0)

SQLSERVER

PS F:\Backups> ((Get-Location).Path.Split(":")).Get(0)

F

etc...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接