En supposant que j'ai un lecteur mappé M:\
vers \\SomeServer\SomeShare
et en PowerShell, je suis dans le dossier M:\SomeFolder
comment puis-je le convertir en chemin UNC, c'est-à-dire \\SomeServer\SomeShare\SomeFolder
.
En supposant que j'ai un lecteur mappé M:\
vers \\SomeServer\SomeShare
et en PowerShell, je suis dans le dossier M:\SomeFolder
comment puis-je le convertir en chemin UNC, c'est-à-dire \\SomeServer\SomeShare\SomeFolder
.
Réponses:
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.
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.
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
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é.
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.
$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