Rufen Sie den aktuellen UNC-Pfad von einem lokalen Pfad in Powershell ab

19408
Chris Chilvers

Angenommen, ich habe ein zugeordnetes Laufwerk M:\zu \\SomeServer\SomeShareund in Powershell in dem Ordner, ich bin, M:\SomeFolderwie konvertiere ich, dass auf einen UNC - Pfad, das heißt \\SomeServer\SomeShare\SomeFolder.

9
sollte auf stackoverflow sein? spoon16 vor 14 Jahren 0

5 Antworten auf die Frage

13
firedfly

Ich bin relativ neu bei PowerShell, daher ist der Code möglicherweise von schlechter Qualität. Es sollte jedoch die gewünschten Informationen erhalten:

$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 sollte den UNC-Pfad enthalten, nach dem Sie suchen.

Vielen Dank, das funktioniert perfekt. Ich habe es ein wenig geändert, um auch mit lokalen Pfaden zu arbeiten. Dies sollte meine lästigen Probleme mit StExBar + runas + Powershell auf einem zugeordneten Laufwerk beheben. Chris Chilvers vor 14 Jahren 0
@firedfly, wie müsste das geändert werden, um lokale Laufwerke zu unterstützen (zB `C: \`)? Es müsste wahrscheinlich den Namen der Maschine angeben, aber ich weiß nicht, wie man zwischen einem Festplattenlaufwerk und einem CD / DVD-Laufwerk unterscheidet. Craig vor 7 Jahren 0
4
Chris Chilvers

Für alle, die sich für das RunAs-Skript für StExBar interessieren, gilt Folgendes:

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

Die Befehlszeile in StExBar lautet:

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

Ersetzen Sie den Pfad durch die Stelle, an der Sie das Skript RunAs.ps1 aufbewahren, und ich speichere es gerne im Stammverzeichnis meines Home-Ordners.

3
David Martin

Ich weiß, dass dies eine alte Frage ist, aber falls jemand die einzeilige Version davon benötigt:

$unc = (gwmi Win32_LogicalDisk -filter "DeviceID = '$((Get-Location).Drive.Name):'").ProviderName 
Note this only works if you actually are on a drive-mapped network path. If you're on a local path, ProviderName is null; if you're on a non-drive-mapped network path, Drive is null. If you need to distinguish between these 3 cases, a one-liner won't cut it. Timbo vor 10 Jahren 0
2
Ryan

Mir ist klar, dass dies eine alte Frage ist, aber ich wollte einen anderen Weg zeigen, um dies zu erreichen:

$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 holt alle Informationen über ein Laufwerk zurück (Name, belegter / freier Speicherplatz, Anbieter, Stammverzeichnis und aktueller Speicherort). Wenn der Name-Parameter als aktueller Laufwerksbuchstabe übergeben wird (mithilfe von get-location), kann dies in mehreren Szenarien funktionieren (Dadurch werden auch Informationen zu lokalen Laufwerken der Maschine abgerufen).

Damit es sowohl auf lokalen als auch auf zugeordneten Laufwerken funktioniert, wird der Vergleich durchgeführt, um $ root mit dem Laufwerksbuchstaben oder dem Netzwerkspeicherort aufzufüllen. Der .Root sendet den Laufwerksbuchstaben zurück und der .DisplayRoot zieht den Netzwerkpfad zurück (null, wenn es sich um einen lokalen Pfad handelt, der der Grund für den Vergleich ist).

Mit Join-Path können Sie den Pfad zusammenfassen, der einen Laufwerksbuchstaben und den aktuellen Ort zurückgibt, wenn es sich um einen lokalen Pfad, einen Netzwerkpfad und um einen aktuellen Ort handelt, wenn es sich um ein zugeordnetes Laufwerk handelt.

Erklären Sie, wie es funktioniert? Adam vor 7 Jahren 0
Erklärung hinzugefügt - Danke, dass Sie das gerufen haben. Ryan vor 7 Jahren 1
0
Cynomus

Also die besten Antworten hier zu einem Einzeiler kombinieren; Prüft den aktuellen Pfad als UNC, ordnet ein Laufwerk dem aktuellen Pfad zu, wechselt zu einem neuen zugeordneten Laufwerk. Wenn bereits ein zugeordnetes Laufwerk vorhanden ist, wird keine Aktion ausgeführt.

IF ((Get-Location | %{$_.Drive}) -eq $NUL){$dltr=%$d}; New-PSDrive –Name $dltr –PSProvider FileSystem –Root ((Get-Location).ProviderPath) –Persist; Set-Location -Path $dltr`: -PassThru} 

Nicht gedacht, um das OP zu beantworten, fügen Sie einfach nützliche Inhalte hinzu. Ich hatte ein Skript, das ich für das Zuordnen eines Laufwerks anstelle von UNC-Pfaden benötigte. Daher überprüfte ich, ob ein UNC in PS verwendet wurde. Anschließend wurde ein Laufwerk mit diesem UNC-Pfad zugeordnet und dann zu diesem Laufwerkbuchstaben gewechselt.