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.


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.


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.


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

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.


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.


-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
Czy opracowałeś kod tego kodu? Zobacz Jak odpowiedzieć i wybrać się na naszą wycieczkę .
Burgi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.