Получить текущий путь UNC из локального пути в PowerShell

Получить текущий путь UNC из локального пути в PowerShell

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

Для тех, кто интересуется скриптом RunAs для StExBar, вот он:

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 извлечет сетевой путь (null, если это локальный путь, что и является причиной сравнения).

Используя 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, поэтому я сделал это, чтобы проверить, используется ли UNC в PS, затем сопоставить диск с использованием этого пути UNC, затем переключиться на эту букву диска.

Связанный контент