Dapatkan jalur UNC saat ini dari jalur lokal di PowerShell


10

Dengan asumsi saya memiliki drive yang dipetakan M:\ke \\SomeServer\SomeSharedan di PowerShell saya di folder M:\SomeFolderbagaimana cara mengubahnya menjadi jalur UNC, yaitu \\SomeServer\SomeShare\SomeFolder.


harus di stackoverflow?
spoon16

Jawaban:


14

Saya cukup baru di PowerShell, jadi kode di bawah ini mungkin berkualitas buruk. Namun, itu harus mendapatkan informasi yang Anda inginkan:

$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 harus berisi jalur UNC yang Anda cari.


Terima kasih banyak, itu bekerja dengan sempurna. Saya telah sedikit memodifikasinya untuk bekerja dengan jalur lokal, ini akan memperbaiki masalah saya yang mengganggu dengan StExBar + runas + PowerShell ke drive yang dipetakan.
Chris Chilvers

@firedfly, bagaimana ini perlu diubah untuk mendukung drive lokal (mis. `C:`)? Mungkin perlu mencantumkan nama mesin, tapi saya tidak tahu bagaimana membedakan antara HDD dan drive CD / DVD.
Craig

4

Untuk siapa pun yang tertarik dengan skrip RunAs untuk StExBar, itu adalah:

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

Dan baris perintah di StExBar adalah:

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

Ganti jalur dengan tempat Anda menyimpan skrip RunAs.ps1, saya ingin menyimpan milik saya di root folder rumah saya.


3

Saya tahu ini adalah pertanyaan lama, tetapi jika seseorang membutuhkan versi satu baris ini:

$unc = (gwmi Win32_LogicalDisk -filter "DeviceID = '$((Get-Location).Drive.Name):'").ProviderName

Catatan ini hanya berfungsi jika Anda benar-benar berada di jalur jaringan yang dipetakan drive. Jika Anda berada di jalur lokal, ProviderName adalah nol; jika Anda berada di jalur jaringan yang tidak dipetakan, Drive adalah nol. Jika Anda perlu membedakan antara 3 case ini, one-liner tidak akan memotongnya.
Timbo

3

Saya menyadari ini adalah pertanyaan lama, tetapi saya ingin berbagi cara lain untuk mencapai ini:

$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 akan menarik kembali semua informasi tentang drive (nama, ruang bekas / bebas, penyedia, root, dan lokasi saat ini) dan meneruskan parameter Nama sebagai huruf drive saat ini (menggunakan get-location) memungkinkan ini untuk berfungsi di banyak scenerio. (ini juga akan menarik kembali informasi tentang drive lokal pada mesin).

Untuk membuatnya bekerja pada drive lokal dan yang dipetakan, perbandingan dilakukan untuk mengisi $ root dengan huruf drive atau lokasi jaringan. .Root akan mengirim kembali huruf drive, dan .DisplayRoot akan menarik kembali jalur jaringan (nol jika itu adalah jalur lokal, yang merupakan alasan untuk perbandingan)

Menggunakan Join-Path, maka Anda dapat menarik bersama path, yang akan mengembalikan huruf drive dan lokasi saat ini jika itu adalah jalur lokal, jalur jaringan, dan lokasi saat ini jika itu adalah drive yang dipetakan.


Jelaskan cara kerjanya?
Adam

1
Menambahkan penjelasan - Terima kasih telah memanggilnya.
Ryan

1
Sama seperti info jika Anda bekerja dengan SharePoint. Saya telah memetakan drive ke pustaka dokumen SharePoint menggunakan cmdlet New-PSDrive. Dalam hal ini saya memiliki huruf drive di properti Name, properti Root berisi path UNC, dan properti DisplayRoot kosong.
pholpar

0

Jadi menggabungkan jawaban terbaik di sini menjadi satu kalimat; Menguji jalur saat ini sebagai UNC, memetakan drive ke jalur saat ini, perubahan ke drive yang dipetakan baru, jika sudah drive yang dipetakan, tidak ada tindakan yang diambil.

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}

Tidak dimaksudkan untuk menjawab OP, cukup tambahkan konten yang bermanfaat. Memiliki skrip yang saya perlukan memetakan drive, bukan jalur UNC, jadi saya melakukan ini untuk memeriksa apakah UNC digunakan di PS, lalu memetakan ke drive menggunakan jalur UNC itu, kemudian beralih ke huruf drive itu.


-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

1
Bisakah Anda menguraikan apa yang dilakukan kode ini? Silakan lihat Cara Menjawab dan ikuti tur kami .
Burgi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.