Obtém o caminho UNC atual de um caminho local no powershell

9

Supondo que eu tenha uma unidade mapeada M:\ to \SomeServer\SomeShare e no powershell, estou na pasta M:\SomeFolder como faço para converter isso em um caminho UNC, ou seja, \SomeServer\SomeShare\SomeFolder .

    
por Chris Chilvers 26.08.2009 / 13:05

5 respostas

13

Sou relativamente novo no PowerShell, portanto, o código abaixo pode ser de baixa qualidade. No entanto, deve obter as informações desejadas:

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

    
por 26.08.2009 / 14:55
4

Para qualquer um interessado 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ê mantiver o script RunAs.ps1, gosto de armazenar o meu na raiz da minha pasta pessoal.

    
por 26.08.2009 / 16:02
3

Eu sei que essa é uma pergunta antiga, mas no caso de alguém precisar da versão de uma linha:

$unc = (gwmi Win32_LogicalDisk -filter "DeviceID = '$((Get-Location).Drive.Name):'").ProviderName
    
por 11.01.2013 / 14:24
2

Sei que essa é uma pergunta antiga, mas queria compartilhar outra maneira de realizar 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 recuperará todas as informações sobre uma unidade (nome, espaço usado / gratuito, provedor, local raiz e atual) e passando o parâmetro Name como a letra da unidade atual (usando get-location) permite que isso funcione em vários scenerios (isso também irá puxar informações sobre drives locais na máquina).

Para que isso funcione nas unidades locais e mapeadas, a comparação é feita para preencher $ root com a letra da unidade ou o local da rede. o .Root irá enviar de volta a letra da unidade, e o .DisplayRoot irá puxar de volta o caminho da rede (null 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 um local atual, se for um caminho local, um caminho de rede e um local atual, se for uma unidade mapeada.

    
por 07.04.2017 / 17:24
0

Portanto, combinar a melhor das respostas aqui em um de uma 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 é executada.

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 pretende responder ao OP, basta adicionar conteúdo útil. Tinha um script que eu precisava mapear a unidade em vez de caminhos UNC, então eu fiz isso para verificar se um UNC estava sendo usado no PS, em seguida, mapeie para uma unidade usando esse caminho UNC, em seguida, mude para essa letra de unidade.

    
por 20.04.2015 / 22:14

Tags