Obtenha o caminho UNC atual de um caminho local no PowerShell

Obtenha o caminho UNC atual de um caminho local no PowerShell

Supondo que eu tenha uma unidade mapeada M:\e \\SomeServer\SomeShareno PowerShell, estou na pasta M:\SomeFoldercomo faço para convertê-la em um caminho UNC, ou seja, \\SomeServer\SomeShare\SomeFolder.

Responder1

Sou bastante novo no PowerShell, então o código abaixo pode ser de baixa qualidade. No entanto, ele deve obter as informações que você deseja:

$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 deve conter o caminho UNC que você está procurando.

Responder2

Para qualquer pessoa interessada no script RunAs para StExBar é:

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

E a linha de comando no StExBar é:

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

Substitua o caminho por onde você mantém o script RunAs.ps1. Gosto de armazenar o meu na raiz da minha pasta pessoal.

Responder3

Sei que esta é uma pergunta antiga, mas gostaria de compartilhar outra maneira de fazer isso:

$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 irá recuperar todas as informações sobre uma unidade (nome, espaço usado/livre, provedor, raiz e localização atual) e passar o parâmetro Name como a letra da unidade atual (usando get-location) permite que isso funcione em vários cenários (isso também recuperará informações nas unidades locais da máquina).

Para fazê-lo funcionar em unidades locais e mapeadas, a comparação é feita para preencher $root com a letra da unidade ou local de rede. o .Root enviará de volta a letra da unidade e o .DisplayRoot recuperará o caminho da rede (nulo se for um caminho local, que é o motivo da comparação)

Usando Join-Path, você pode reunir o caminho, que retornará uma letra de unidade e a localização atual se for um caminho local, um caminho de rede e uma localização atual se for uma unidade mapeada.

Responder4

Portanto, combine as melhores respostas aqui em uma única linha; Testa o caminho atual como UNC, mapeia uma unidade para o caminho atual, altera para a nova unidade mapeada, se já for uma unidade mapeada, nenhuma ação será tomada.

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}

Não se destina a responder ao OP, apenas adicione conteúdo útil. Tinha um script que precisava de uma unidade mapeada em vez de caminhos UNC, então fiz isso para verificar se um UNC estava sendo usado no PS, mapeei para uma unidade usando esse caminho UNC e depois mudei para essa letra de unidade.

informação relacionada