从Powershell中的本地路径获取当前UNC路径


10

假设我有一个映射驱动器M:\\\SomeServer\SomeShare并且在powershell中,我在文件夹中M:\SomeFolder如何将其转换为UNC路径,即\\SomeServer\SomeShare\SomeFolder


应该在stackoverflow上?
勺子

Answers:


14

我对PowerShell相当陌生,因此下面的代码质量可能很差。但是,它应该获得您想要的信息:

$currentDirectory = Get-Location
$currentDrive = Split-Path -qualifier $currentDirectory.Path
$logicalDisk = Gwmi Win32_LogicalDisk -filter "DriveType = 4 AND DeviceID = '$currentDrive'"
$uncPath = $currentDirectory.Path.Replace($currentDrive, $logicalDisk.ProviderName)

$ uncPath应该包含您要查找的UNC路径。


非常感谢,效果很好。我也对其进行了少许修改,以使用本地路径,这应该可以将StExBar + runas + powershell的烦人问题解决到映射驱动器。
克里斯·奇尔弗斯

@firedfly,需要如何更改此设置以支持本地驱动器(例如“ C:”)?它可能需要包含机器的名称,但是我不知道如何区分HDD和CD / DVD驱动器。
Craig

4

对于任何对StExBar的RunAs脚本感兴趣的人:

param([string] $username)

$path = Get-Location
$currentDrive = Split-Path -qualifier $path
$logicalDisk = Get-WmiObject Win32_LogicalDisk -filter "DeviceID = '$currentDrive'"

if ($logicalDisk.DriveType -eq 4)
{
    $path = Join-Path $logicalDisk.ProviderName (Split-Path -NoQualifier $path)
}

$systemroot = [System.Environment]::SystemDirectory

&"$systemroot\runas.exe" /user:$username "$systemroot\windowspowershell\v1.0\powershell.exe -NoExit -Command \`" &{ Set-Location '$path' }\`""

StExBar中的命令行为:

C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -Command "&{ &'%homedrive%%homepath%\RunAs.ps1' 'domain\username' }"

将路径替换为您保留RunAs.ps1脚本的位置,我希望将其存储在主文件夹的根目录中。


3

我知道这是一个老问题,但是如果有人需要此版本的单行版本:

$unc = (gwmi Win32_LogicalDisk -filter "DeviceID = '$((Get-Location).Drive.Name):'").ProviderName

请注意,这仅在您实际位于驱动器映射的网络路径上时才有效。如果您在本地路径上,则ProviderName为null;否则,为null。如果您位于非驱动器映射的网络路径上,则Drive为空。如果您需要区分这3种情况,单线将不会削减。
廷博

3

我意识到这是一个古老的问题,但是我想分享另一种方法来完成此任务:

$drive = Get-PSDrive -Name (get-location).Drive.Name
$root = if($drive.DisplayRoot -ne $null){$drive.DisplayRoot} else {$drive.Root}
Join-Path -Path $root -ChildPath $drive.CurrentLocation

Get-PSDrive将拉回有关驱动器的所有信息(名称,已用/可用空间,提供者,根目录和当前位置),并将Name参数作为当前驱动器号(使用get-location)传递,使它可以在多个场景中使用(这还将拉回计算机上本地驱动器上的信息)。

为了使其在本地驱动器和映射驱动器上均能正常工作,需要进行比较以在$ root中填充驱动器号或网络位置。.Root将发送回驱动器号,.DisplayRoot将拉回网络路径(如果是本地路径,则为null,这是进行比较的原因)

然后,您可以使用Join-Path合并路径,如果是本地路径,则将返回驱动器号和当前位置;如果是映射的驱动器,则将返回网络位置和当前位置。


解释它是如何工作的?
亚当

1
添加了解释-感谢您对此进行说明。
Ryan

1
就像信息一样(如果您正在使用SharePoint)。我已使用New-PSDrive cmdlet将驱动器映射到SharePoint文档库。在这种情况下,我的Name属性中包含驱动器号,Root属性包含UNC路径,而DisplayRoot属性为空。
pholpar

0

因此,将此处的最佳答案组合成一线;测试当前路径是否为UNC,将驱动器映射到当前路径,更改为新的映射驱动器,如果已映射驱动器,则不执行任何操作。

IF ((Get-Location | %{$_.Drive}) -eq $NUL){$dltr=%{for($j=67;gdr($d=[char]++$j)2>0){}$d}; New-PSDrive –Name $dltr –PSProvider FileSystem –Root ((Get-Location).ProviderPath) –Persist; Set-Location -Path $dltr`: -PassThru}

不打算回答OP,仅添加有用的内容。有了一个脚本,我需要映射驱动器而不是UNC路径,所以我这样做是为了检查PS中是否使用了UNC,然后使用该UNC路径映射到驱动器,然后切换到该驱动器号。


-2
$CurrentFolder = "H:\Documents"

$Query = "Select * from Win32_NetworkConnection where LocalName = '" + $CurrentFolder.Substring( 0, 2 ) + "'"
( Get-WmiObject -Query $Query ).RemoteName

$Tst = $CurrentFolder.Substring( 0, 2 )
( Get-WmiObject -Query "Select * from Win32_NetworkConnection where LocalName = '$Tst'" ).RemoteName

1
您可以详细介绍一下这段代码的作用吗?请参阅“ 如何回答”并开始我们的游览
Burgi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.