M:\
Angenommen, ich habe ein zugeordnetes Laufwerk \\SomeServer\SomeShare
und befinde mich in Powershell im Ordner. M:\SomeFolder
Wie konvertiere ich das in einen UNC-Pfad, d. h. \\SomeServer\SomeShare\SomeFolder
.
Antwort1
Ich bin relativ neu bei PowerShell, daher ist die Qualität des folgenden Codes möglicherweise schlecht. Er sollte jedoch die gewünschten Informationen liefern:
$currentDirectory = Get-Location
$currentDrive = Split-Path -qualifier $currentDirectory.Path
# Mapping a non-network drive? Check the DriveType enum documentation https://docs.microsoft.com/en-us/dotnet/api/system.io.drivetype?view=net-6.0
$logicalDisk = Get-CimInstance -ClassName Win32_LogicalDisk -filter "DriveType = 4 AND DeviceID = '$currentDrive'"
$uncPath = $currentDirectory.Path.Replace($currentDrive, $logicalDisk.ProviderName)
$uncPath sollte den gesuchten UNC-Pfad enthalten.
Antwort2
Für alle, die sich für das RunAs-Skript für StExBar interessieren:
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' }\`""
Und 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 den Speicherort des Skripts RunAs.ps1. Ich speichere meines gerne im Stammverzeichnis meines Home-Ordners.
Antwort3
Mir ist klar, dass dies eine alte Frage ist, aber ich wollte Ihnen eine andere Möglichkeit zeigen, wie dies erreicht werden kann:
$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“ ruft alle Informationen zu einem Laufwerk ab (Name, genutzter/freier Speicherplatz, Anbieter, Stammverzeichnis und aktueller Speicherort). Durch die Übergabe des Parameters „Name“ als aktueller Laufwerksbuchstabe (mithilfe von „get-location“) funktioniert dies in mehreren Szenarien (dadurch werden auch Informationen zu lokalen Laufwerken auf dem Computer 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 zu füllen. .Root sendet den Laufwerksbuchstaben zurück und .DisplayRoot ruft den Netzwerkpfad ab (null, wenn es sich um einen lokalen Pfad handelt, was der Grund für den Vergleich ist).
Mit Join-Path können Sie dann den Pfad zusammenstellen. Bei einem lokalen Pfad werden ein Laufwerksbuchstabe und der aktuelle Standort zurückgegeben, bei einem zugeordneten Laufwerk ein Netzwerkpfad und der aktuelle Standort.
Antwort4
Kombinieren Sie also die besten Antworten hier in einem Einzeiler: Testet den aktuellen Pfad als UNC, ordnet ein Laufwerk dem aktuellen Pfad zu, wechselt zu einem neuen zugeordneten Laufwerk. Wenn bereits ein Laufwerk zugeordnet 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}
Es soll nicht die Antwort auf den OP sein, sondern nur nützlichen Inhalt hinzufügen. Ich hatte ein Skript, für das ich ein zugeordnetes Laufwerk anstelle von UNC-Pfaden brauchte, also habe ich dies getan, um zu prüfen, ob in PS ein UNC verwendet wird, dann habe ich es einem Laufwerk zugeordnet, das diesen UNC-Pfad verwendet, und dann zu diesem Laufwerksbuchstaben gewechselt.