Supondo que eu tenha uma unidade mapeada M:\
e \\SomeServer\SomeShare
no PowerShell, estou na pasta M:\SomeFolder
como 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.