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

10

Предполагая , что у меня есть сетевой диск , M:\чтобы \\SomeServer\SomeShareи в PowerShell я нахожусь в папке , M:\SomeFolderкак преобразовать , что путь UNC, т.е.\\SomeServer\SomeShare\SomeFolder .

Крис Чилверс
источник
должен быть на stackoverflow?
ложка 16

Ответы:

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-путь, который вы ищете.

firedfly
источник
Большое спасибо, это работает отлично. Я немного изменил его для работы с локальными путями, это должно исправить мои досадные проблемы с StExBar + runas + powershell на подключенном диске.
Крис Чилверс
@firedfly, как это нужно изменить для поддержки локальных дисков (например, `C:`)? Вероятно, потребуется указать имя машины, но я не знаю, как можно отличить жесткий диск от привода CD / DVD.
Крейг,
4

Для любого, кто интересуется скриптом 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

Я знаю, что это старый вопрос, но в случае, если кому-то нужна однострочная версия этого:

$unc = (gwmi Win32_LogicalDisk -filter "DeviceID = '$((Get-Location).Drive.Name):'").ProviderName
Дэвид Мартин
источник
Обратите внимание, что это работает только в том случае, если вы на самом деле находитесь в подключенном к сети сетевом пути. Если вы находитесь на локальном пути, ProviderName имеет значение null; если вы используете сетевой путь, не связанный с диском, то Drive is null. Если вам необходимо различить эти 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 отзовет сетевой путь (ноль, если это локальный путь, который является причиной для сравнения)

Используя Join-Path, вы можете собрать путь, который будет возвращать букву диска и текущее местоположение, если это локальный путь, сетевой путь и текущее местоположение, если это подключенный диск.

Райан
источник
Объясните как это работает?
Адам
1
Добавлено объяснение - Спасибо за это.
Райан
1
Так же, как информация, если вы работаете с SharePoint. Я подключил диск к библиотеке документов SharePoint с помощью командлета New-PSDrive. В этом случае у меня есть буква диска в свойстве 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}

Не предназначен для ответа на ОП, просто добавьте полезный контент. У меня был сценарий, для которого мне требовался сопоставленный диск вместо путей UNC, поэтому я сделал это, чтобы проверить, используется ли UNC в PS, затем сопоставил диск с этим путем UNC, а затем переключился на эту букву диска.

Cynomus
источник
-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
dieseyer
источник
1
Не могли бы вы уточнить, что делает этот код? Пожалуйста, посмотрите, как ответить и принять наш тур .
Бурги