Obter o caminho UNC atual a partir de um caminho local no PowerShell

10

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

Chris Chilvers
fonte
deve estar no stackoverflow?
spoon16

Respostas:

14

Como sou relativamente novo no PowerShell, 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
$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.

firedfly
fonte
Muito obrigado, isso funciona perfeitamente. Também o modifiquei um pouco para trabalhar com caminhos locais. Isso deve corrigir meus problemas irritantes com o StExBar + runas + powershell em uma unidade mapeada.
22730 Chris Chilvers
@firedfly, como isso precisaria ser alterado para suportar unidades locais (por exemplo, `C:`)? Provavelmente seria necessário incluir o nome da máquina, mas não sei como diferenciar entre uma unidade de disco rígido e CD / DVD.
Craig
4

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 quer que você mantenha o script RunAs.ps1, gosto de armazenar o meu na raiz da minha pasta pessoal.

Chris Chilvers
fonte
3

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

$unc = (gwmi Win32_LogicalDisk -filter "DeviceID = '$((Get-Location).Drive.Name):'").ProviderName
David Martin
fonte
Observe que isso só funciona se você estiver em um caminho de rede mapeado por unidade. Se você estiver em um caminho local, ProviderName será nulo; se você estiver em um caminho de rede não mapeado para a unidade, a unidade será nula. Se você precisar distinguir entre esses três casos, uma linha não será suficiente.
Timbo
3

Sei que essa é uma pergunta antiga, mas queria 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

O Get-PSDrive retira todas as informações sobre uma unidade (nome, espaço usado / livre, provedor, raiz e local atual) e passa 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 retira informações sobre as unidades locais na máquina).

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

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

Ryan
fonte
Explique como isso funciona?
Adam
11
Mais explicações - Obrigado por chamar isso.
21717 Ryan
11
Assim como informações, se você estiver trabalhando com o SharePoint. Mapeei uma unidade para uma biblioteca de documentos do SharePoint usando o cmdlet New-PSDrive. Nesse caso, tenho a letra da unidade na propriedade Name, a propriedade Root contém o caminho UNC e a propriedade DisplayRoot está vazia.
Pholpar 11/03/19
0

Então, combinando as melhores respostas aqui em uma linha; Testa o caminho atual como UNC, mapeia uma unidade para o caminho atual, muda para a nova unidade mapeada, se já é uma unidade mapeada, nenhuma ação é 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 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 fiz isso para verificar se um UNC estava sendo usado no PS, depois mapeie para uma unidade usando esse caminho UNC e depois mude para a letra da unidade.

Cynomus
fonte
-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
fonte
11
Você pode explicar o que esse código faz? Por favor, veja Como responder e faça nosso tour .
Burgi