Geçerli UNC yolunu powershell'deki yerel bir yoldan alma


10

Bir eşlenen sürücü var varsayarsak M:\için \\SomeServer\SomeShareve powershell ben klasöründe olduğum M:\SomeFoldernasıl yaptıklarını yani bir UNC yolu, bu dönüştürmek \\SomeServer\SomeShare\SomeFolder.


stackoverflow üzerinde olmalıdır?
spoon16 5:09

Yanıtlar:


14

PowerShell için oldukça yeniyim, bu nedenle aşağıdaki kod kalitesiz olabilir. Ancak, istediğiniz bilgileri almalıdır:

$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, aradığınız UNC yolunu içermelidir.


Çok teşekkürler, bu mükemmel çalışıyor. Ben de yerel yolları ile çalışmak için biraz değiştirdim, bu StExBar + runas + powershell ile eşlenen bir sürücüye can sıkıcı sorunları düzeltmek gerekir.
Chris Chilvers

@firedfly, bunun yerel sürücüleri desteklemek için nasıl değiştirilmesi gerekir (örneğin `` C: `)? Muhtemelen makinenin adını içermesi gerekir, ancak bir HDD ve CD / DVD sürücüsü arasında nasıl ayrım yapacağımı bilmiyorum.
Craig

4

StExBar için RunAs betiği ile ilgilenen herhangi biri için:

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

Ve StExBar'daki komut satırı:

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

Yolu RunAs.ps1 betiğini sakladığınız yerle değiştirin, benim ana klasörümün kökünde benimkini saklamak istiyorum.


3

Bu eski bir soru olduğunu biliyorum, ama birisi bunun bir satır sürümüne ihtiyaç durumunda:

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

Bunun yalnızca sürücü eşlemeli bir ağ yolundaysanız işe yaradığını unutmayın. Yerel bir yoldaysanız, ProviderName boştur; sürücü eşlemeli olmayan bir ağ yolundaysanız Drive boştur. Bu 3 durum arasında ayrım yapmanız gerekirse, bir astar onu kesmez.
Timbo

3

Bunun eski bir soru olduğunun farkındayım, ancak bunu başarmanın başka bir yolunu paylaşmak istedim:

$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, bir sürücü (ad, kullanılan / boş alan, sağlayıcı, kök ve geçerli konum) hakkındaki tüm bilgileri geri alır ve Name parametresini geçerli sürücü harfi olarak (get-location kullanarak) iletmek, bunun birden fazla senaryoda çalışmasına izin verir (bu aynı zamanda makinedeki yerel sürücüler hakkındaki bilgileri geri alır).

Hem yerel hem de eşlenmiş sürücülerde çalışmasını sağlamak için, $ root'u sürücü harfi veya ağ konumu ile doldurmak için karşılaştırma yapılır. .Root sürücü harfini geri gönderir ve .DisplayRoot ağ yolunu geri çeker (karşılaştırmanın nedeni bu yerel bir yolsa null)

Birleştirme Yolu'nu kullanarak, bir yerel yol, ağ yolu ve eşlenmiş bir sürücü ise geçerli konum ise bir sürücü harfi ve geçerli konumu döndürecek yolu bir araya getirebilirsiniz.


Nasıl çalıştığını açıklayın?
Adam

1
Ek açıklama - Bunu söylediğin için teşekkürler.
Ryan

1
SharePoint ile çalışıyorsanız bilgi gibi. New-PSDrive cmdlet'ini kullanarak bir sürücüyü SharePoint belge kitaplığına eşledim. Bu durumda, Name özelliğinde sürücü harfi var, Root özelliği UNC yolunu içerir ve DisplayRoot özelliği boştur.
Şubat 19'da pholpar

0

Buradaki cevapların en iyilerini tek satırda birleştirmek; Geçerli yolu UNC olarak test eder, bir sürücüyü geçerli yola eşler, yeni eşlenen sürücüye değişir, zaten eşlenmiş bir sürücü varsa, herhangi bir işlem yapılmaz.

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}

OP'ye cevap vermek için tasarlanmamıştır, sadece yararlı içerik ekleyin. UNC yolları yerine eşlenmiş sürücüye ihtiyaç duyduğum bir komut dosyası vardı, bu yüzden bunu bir UNC'nin PS'de kullanılıp kullanılmadığını kontrol etmek için yaptım, daha sonra bu UNC yolunu kullanarak bir sürücüye eşleyin, sonra bu sürücü harfine geçin.


-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
Bu kodun ne yaptığını biraz açıklayabilir misiniz? Lütfen Nasıl Cevap Verilir ve turumuza katılın .
Burgi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.