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

9

Angenommen, ich habe ein zugeordnetes Laufwerk M:\ zu \\SomeServer\SomeShare und in PowerShell bin ich im Ordner M:\SomeFolder Wie konvertiere ich das in einen UNC-Pfad, d. h. \\SomeServer\SomeShare\SomeFolder.

Chris Chilvers
quelle
sollte auf stackoverflow sein?
spoon16

Antworten:

13

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.

firedfly
quelle
Vielen Dank, das funktioniert perfekt. Ich habe es leicht modifiziert, um auch mit lokalen Pfaden zu arbeiten. Dies sollte meine lästigen Probleme mit StExBar + runas + Powershell auf einem zugeordneten Laufwerk beheben.
Chris Chilvers
@firedfly, wie müsste das geändert werden, um lokale Laufwerke zu unterstützen (z. B. "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
4

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 Basisordners.

Chris Chilvers
quelle
3

Ich weiß, das ist eine alte Frage, aber falls jemand die einzeilige Version davon braucht:

$unc = (gwmi Win32_LogicalDisk -filter "DeviceID = '$((Get-Location).Drive.Name):'").ProviderName
David Martin
quelle
Beachten Sie, dass dies nur funktioniert, wenn Sie sich tatsächlich in einem Netzwerkpfad befinden, auf dem Laufwerke zugeordnet sind. Wenn Sie sich in einem lokalen Pfad befinden, ist ProviderName null. Wenn Sie sich auf einem nicht dem Laufwerk zugewiesenen Netzwerkpfad befinden, ist Drive NULL. Wenn Sie zwischen diesen drei Fällen unterscheiden müssen, wird sie von einem Einzeiler nicht geschnitten.
Timbo
2

Ich weiß, 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 zu einem Laufwerk zurück (Name, belegter / freier Speicherplatz, Anbieter, Stammverzeichnis und aktueller Speicherort). Wenn der Parameter Name 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 Speicherort zurückgibt, wenn es sich um einen lokalen Pfad, einen Netzwerkpfad und um einen aktuellen Speicherort handelt, wenn es sich um ein zugeordnetes Laufwerk handelt.

Ryan
quelle
Erklären Sie, wie es funktioniert
Adam
1
Erklärung hinzugefügt - Danke, dass Sie das gerufen haben.
Ryan
0

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=%{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}

Nicht zur Beantwortung des OP gedacht, fügen Sie einfach nützliche Inhalte hinzu. Ich hatte ein Skript, das ich anstelle von UNC-Pfaden einem zugeordneten Laufwerk 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.

Cynomus
quelle