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

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

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

答案1

我对 PowerShell 还不熟悉,因此下面的代码可能质量较差。但是,它应该可以获取您想要的信息:

$currentDirectory = Get-Location
$currentDrive = Split-Path -qualifier $currentDirectory.Path
# Mapping a non-network drive? Check the DriveType enum documentation https://docs.microsoft.com/en-us/dotnet/api/system.io.drivetype?view=net-6.0
$logicalDisk = Get-CimInstance -ClassName Win32_LogicalDisk -filter "DriveType = 4 AND DeviceID = '$currentDrive'"
$uncPath = $currentDirectory.Path.Replace($currentDrive, $logicalDisk.ProviderName)

$uncPath 应该包含您正在寻找的 UNC 路径。

答案2

对于任何对 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

我意识到这是一个老问题,但我想分享另一种方法来实现这一目标:

$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 将拉回网络路径(如果是本地路径则为空,这是比较的原因)

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

答案4

因此,将这里最好的答案组合成一行;测试当前路径作为 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 路径映射到驱动器,然后切换到该驱动器号。

相关内容