Obtenez le chemin UNC actuel à partir d'un chemin local dans PowerShell

10

En supposant que j'ai un lecteur mappé M:\vers \\SomeServer\SomeShareet en PowerShell, je suis dans le dossier M:\SomeFoldercomment puis-je le convertir en chemin UNC, c'est-à-dire \\SomeServer\SomeShare\SomeFolder.

Chris Chilvers
la source
devrait être sur stackoverflow?
spoon16

Réponses:

14

Je suis assez nouveau sur PowerShell, donc le code ci-dessous peut être de mauvaise qualité. Cependant, il devrait obtenir les informations souhaitées:

$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 doit contenir le chemin UNC que vous recherchez.

luciole
la source
Merci beaucoup, cela fonctionne parfaitement. Je l'ai légèrement modifié pour qu'il fonctionne également avec les chemins locaux, cela devrait résoudre mes problèmes ennuyeux avec StExBar + runas + powershell sur un lecteur mappé.
Chris Chilvers
@firedfly, comment cela devrait-il être modifié pour prendre en charge les disques locaux (par exemple `C:`)? Il faudrait probablement inclure le nom de la machine, mais je ne sais pas comment on pourrait faire la différence entre un disque dur et un lecteur de CD / DVD.
Craig
4

Pour toute personne intéressée par le script RunAs pour StExBar, c'est:

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

Et la ligne de commande dans StExBar est:

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

Remplacez le chemin par l'endroit où vous conservez le script RunAs.ps1, j'aime stocker le mien dans la racine de mon dossier personnel.

Chris Chilvers
la source
3

Je sais que c'est une vieille question, mais au cas où quelqu'un aurait besoin de la version une ligne de ceci:

$unc = (gwmi Win32_LogicalDisk -filter "DeviceID = '$((Get-Location).Drive.Name):'").ProviderName
David Martin
la source
Notez que cela ne fonctionne que si vous êtes réellement sur un chemin réseau mappé par lecteur. Si vous êtes sur un chemin local, ProviderName est null; si vous êtes sur un chemin réseau non mappé au lecteur, Drive est nul. Si vous devez faire la distinction entre ces 3 étuis, un seul revêtement ne le coupera pas.
Timbo
3

Je me rends compte que c'est une vieille question, mais je voulais partager une autre façon d'y parvenir:

$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 récupérera toutes les informations sur un lecteur (nom, espace utilisé / libre, fournisseur, racine et emplacement actuel) et le passage du paramètre Name comme lettre de lecteur actuelle (en utilisant get-location) permet à cela de fonctionner dans plusieurs scénarios (cela récupérera également des informations sur les disques locaux de la machine).

Afin de le faire fonctionner sur les lecteurs locaux et mappés, la comparaison est effectuée pour remplir $ root avec la lettre de lecteur ou l'emplacement réseau. le .Root renverra la lettre de lecteur, et le .DisplayRoot retirera le chemin réseau (null s'il s'agit d'un chemin local, ce qui est la raison de la comparaison)

En utilisant Join-Path, vous pouvez rassembler le chemin, qui renverra une lettre de lecteur et l'emplacement actuel s'il s'agit d'un chemin local, d'un chemin réseau et d'un emplacement actuel s'il s'agit d'un lecteur mappé.

Ryan
la source
Expliquez comment cela fonctionne?
Adam
1
Explication ajoutée - Merci d'avoir appelé cela.
Ryan
1
Tout comme les informations si vous travaillez avec SharePoint. J'ai mappé un lecteur à une bibliothèque de documents SharePoint à l'aide de l'applet de commande New-PSDrive. Dans ce cas, j'ai la lettre de lecteur dans la propriété Name, la propriété Root contient le chemin UNC et la propriété DisplayRoot est vide.
pholpar
0

Donc, en combinant la meilleure des réponses ici en une seule ligne; Teste le chemin actuel en tant qu'UNC, mappe un lecteur sur le chemin actuel, passe au nouveau lecteur mappé, s'il s'agit déjà d'un lecteur mappé, aucune action n'est entreprise.

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}

Non destiné à répondre à l'OP, il suffit d'ajouter du contenu utile. J'avais un script dont j'avais besoin d'un lecteur mappé au lieu de chemins UNC, j'ai donc fait cela pour vérifier si un UNC était utilisé dans PS, puis mapper sur un lecteur en utilisant ce chemin UNC, puis basculer sur cette lettre de lecteur.

Cynomus
la source
-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
la source
1
Pouvez-vous expliquer ce que fait ce code? Veuillez voir Comment répondre et faire notre visite .
Burgi