Obtenga la ruta UNC actual de una ruta local en powershell

10

Suponiendo que tengo una unidad asignada M:\a \\SomeServer\SomeSharecomo en PowerShell que estoy en la carpeta M:\SomeFolder¿Cómo convierto eso a una ruta UNC, es decir \\SomeServer\SomeShare\SomeFolder.

Chris Chilvers
fuente
debería estar en stackoverflow?
spoon16

Respuestas:

14

Soy bastante nuevo en PowerShell, por lo que el siguiente código puede ser de baja calidad. Sin embargo, debe obtener la información que desea:

$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 debe contener la ruta UNC que está buscando.

mosca
fuente
Muchas gracias, eso funciona perfectamente. También lo modifiqué un poco para que funcione con rutas locales, esto debería solucionar mis molestos problemas con StExBar + runas + powershell en una unidad asignada.
Chris Chilvers
@firedfly, ¿cómo debería modificarse esto para admitir unidades locales (por ejemplo, `C:`)? Probablemente deba incluir el nombre de la máquina, pero no sé cómo diferenciar entre un HDD y una unidad de CD / DVD.
Craig
4

Para cualquiera interesado en el script RunAs para StExBar es:

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

Y la línea de comando en StExBar es:

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

Reemplace la ruta con el lugar donde guarda el script RunAs.ps1, me gusta almacenar el mío en la raíz de mi carpeta de inicio.

Chris Chilvers
fuente
3

Sé que esta es una vieja pregunta, pero en caso de que alguien necesite la versión de una línea de esto:

$unc = (gwmi Win32_LogicalDisk -filter "DeviceID = '$((Get-Location).Drive.Name):'").ProviderName
David Martin
fuente
Tenga en cuenta que esto solo funciona si realmente se encuentra en una ruta de red asignada a la unidad. Si está en una ruta local, ProviderName es nulo; si está en una ruta de red no asignada a Drive, Drive es nulo. Si necesita distinguir entre estos 3 casos, una sola línea no lo cortará.
Timbo
3

Me doy cuenta de que esta es una vieja pregunta, pero quería compartir otra forma de lograr esto:

$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 retirará toda la información sobre una unidad (nombre, espacio utilizado / libre, proveedor, raíz y ubicación actual) y pasar el parámetro Nombre como la letra de unidad actual (usando get-location) permite que esto funcione en múltiples escenarios (Esto también retirará la información sobre las unidades locales en la máquina).

Para que funcione en unidades locales y mapeadas, la comparación se realiza para completar $ root con la letra de unidad o la ubicación de red. .Root devolverá la letra de la unidad, y .DisplayRoot retirará la ruta de red (nulo si es una ruta local, que es la razón de la comparación)

Usando Join-Path, puede juntar la ruta, que devolverá una letra de unidad y la ubicación actual si es una ruta local, ruta de red y ubicación actual si es una unidad asignada.

Ryan
fuente
¿Explicar cómo funciona?
Adam
1
Explicación agregada: gracias por llamarlo.
Ryan
1
Igual que la información si está trabajando con SharePoint. He asignado una unidad a una biblioteca de documentos de SharePoint con el cmdlet New-PSDrive. En este caso, tengo la letra de unidad en la propiedad Name, la propiedad Root contiene la ruta UNC y la propiedad DisplayRoot está vacía.
pholpar
0

Así que combina la mejor de las respuestas aquí en una sola línea; Prueba la ruta actual como UNC, asigna una unidad a la ruta actual, cambia a la nueva unidad asignada, si ya es una unidad asignada, no se toman medidas.

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}

No está destinado a responder el OP, solo agregue contenido útil. Tenía un script que necesitaba una unidad asignada en lugar de rutas UNC, así que hice esto para verificar si se estaba utilizando una UNC en PS, luego se asignó a una unidad usando esa ruta UNC, luego cambié a esa letra de unidad.

Cynomus
fuente
-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
fuente
1
¿Puedes explicar qué hace este código? Consulte Cómo responder y realice nuestro recorrido .
Burgi