Pobierz bieżącą ścieżkę UNC z lokalnej ścieżki w PowerShell

10

Zakładając, że mam zmapowany dysk M:\do programu \\SomeServer\SomeSharePowerShell i jestem w folderze, w M:\SomeFolderjaki sposób przekonwertować go na ścieżkę UNC, tj \\SomeServer\SomeShare\SomeFolder.

Chris Chilvers
źródło
powinien być na stosie przepływu?
łyżka 16

Odpowiedzi:

14

Jestem dość nowy w PowerShell, więc poniższy kod może być złej jakości. Powinien jednak uzyskać potrzebne informacje:

$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 powinien zawierać ścieżkę UNC, której szukasz.

firedfly
źródło
Dzięki bardzo, to działa idealnie. Zmodyfikowałem go nieco, aby działał również ze ścieżkami lokalnymi, to powinno naprawić moje irytujące problemy ze StExBar + Runas + PowerShell na mapowanym dysku.
Chris Chilvers
@firedfly, jak należy to zmienić, aby obsługiwać dyski lokalne (np. `C:`)? Prawdopodobnie musiałaby zawierać nazwę urządzenia, ale nie wiem, jak odróżnić dysk twardy od napędu CD / DVD.
Craig
4

Dla każdego zainteresowanego skryptem RunAs dla StExBar jest to:

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' }\`""

A wiersz poleceń w StExBar to:

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

Zamień ścieżkę gdziekolwiek trzymasz skrypt RunAs.ps1, lubię przechowywać moje w katalogu głównym mojego folderu domowego.

Chris Chilvers
źródło
3

Wiem, że to stare pytanie, ale na wypadek, gdyby ktoś potrzebował wersji w jednym wierszu:

$unc = (gwmi Win32_LogicalDisk -filter "DeviceID = '$((Get-Location).Drive.Name):'").ProviderName
David Martin
źródło
Uwaga: działa to tylko wtedy, gdy faktycznie znajdujesz się na ścieżce sieci zamapowanej na dysku. Jeśli jesteś na ścieżce lokalnej, nazwa dostawcy nie ma wartości; jeśli znajdujesz się w ścieżce sieci bez mapowania dysku, Dysk jest pusty. Jeśli musisz rozróżnić te 3 przypadki, jedna linijka nie będzie tego robić.
Timbo
3

Zdaję sobie sprawę, że to stare pytanie, ale chciałem podzielić się innym sposobem na osiągnięcie tego:

$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 pobierze wszystkie informacje o dysku (nazwa, zajęte / wolne miejsce, dostawca, katalog główny i bieżąca lokalizacja), a przekazanie parametru Nazwa jako bieżącej litery dysku (przy użyciu get-location) pozwala na pracę w wielu scenariuszach (spowoduje to również wycofanie informacji o lokalnych dyskach na komputerze).

Aby umożliwić działanie zarówno na dyskach lokalnych, jak i zmapowanych, porównuje się, aby zapełnić $ root literą dysku lub lokalizacją sieci. .Root odeśle literę dysku, a .DisplayRoot wycofa ścieżkę sieci (zero, jeśli jest to ścieżka lokalna, co jest przyczyną porównania)

Za pomocą Join-Path możesz połączyć ścieżkę, która zwróci literę dysku i bieżącą lokalizację, jeśli jest to ścieżka lokalna, ścieżka sieciowa i bieżąca lokalizacja, jeśli jest to dysk zamapowany.

Ryan
źródło
Wyjaśnij, jak to działa?
Adam,
1
Dodano wyjaśnienie - Dziękujemy za wywołanie tego.
Ryan,
1
Podobnie jak informacje, jeśli pracujesz z SharePoint. Zamapowałem dysk do biblioteki dokumentów SharePoint przy użyciu polecenia cmdlet New-PSDrive. W tym przypadku mam literę dysku we właściwości Name, właściwość Root zawiera ścieżkę UNC, a właściwość DisplayRoot jest pusta.
pholpar
0

Więc łącząc najlepsze odpowiedzi tutaj w jedną linijkę; Testuje bieżącą ścieżkę jako UNC, mapuje dysk na bieżącą ścieżkę, zmienia na nowy dysk mapowany, jeśli jest już mapowany dysk, nie są podejmowane żadne działania.

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}

Nie zamierzam odpowiadać na PO, wystarczy dodać przydatne treści. Miałem skrypt, który potrzebowałem zamapowanego dysku zamiast ścieżek UNC, więc zrobiłem to, aby sprawdzić, czy UNC jest używany w PS, następnie zmapuj na dysk za pomocą tej ścieżki UNC, a następnie przełącz się na tę literę dysku.

Cynomus
źródło
-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
źródło
1
Czy opracowałeś kod tego kodu? Zobacz Jak odpowiedzieć i wybrać się na naszą wycieczkę .
Burgi