Отримайте поточний шлях UNC з локального шляху в powerhell


10

Якщо припустити, що у мене є картографічний привід M:\до \\SomeServer\SomeShareта в повному обсязі, я перебуваю в папці, M:\SomeFolderяк перетворити це на шлях UNC, тобто \\SomeServer\SomeShare\SomeFolder.


має бути на стаковому потоці?
ложка16,

Відповіді:


14

Я досить новачок у PowerShell, тому код нижче може бути низької якості. Однак він повинен отримати потрібну інформацію:

$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 повинен містити шлях UNC, який ви шукаєте.


Дуже дякую, що працює чудово. Я трохи змінив його для роботи з локальними шляхами, це повинно виправити мої набридливі проблеми зі StExBar + runas + powerhell на зібраному диску.
Кріс Чілверс

@firedfly, як це потрібно змінити для підтримки локальних накопичувачів (наприклад, `C:`)? Ймовірно, потрібно буде вказати назву машини, але я не знаю, як можна було б розрізняти жорсткий диск та привід CD / DVD.
Крейг

4

Для всіх, хто цікавиться сценарієм RunAs для 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' }\`""

І командний рядок в StExBar:

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

Замініть шлях на те, де ви завжди зберігаєте сценарій RunAs.ps1, я люблю зберігати моє у корені моєї домашньої папки.


3

Я знаю, що це старе питання, але у випадку, коли комусь потрібна однорядкова версія цього:

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

Зверніть увагу, це працює лише в тому випадку, якщо ви фактично перебуваєте на мережевому шляху, відображеному на накопичувачі. Якщо ви перебуваєте на локальному шляху, ProviderName є нульовим; якщо ви перебуваєте на мережевому шляху, не відображеному на диск, Диск недійсний. Якщо вам потрібно розрізнити ці 3 випадки, однолінійний виріб не вирізає.
Тімбо

3

Я усвідомлюю, що це давнє питання, але я хотів поділитися іншим способом досягнення цього:

$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 поверне всю інформацію про накопичувач (ім'я, використаний / вільний простір, постачальник, корінь та поточне місцезнаходження) та передача параметра Name, оскільки поточна літера диска (використовуючи get-location) дозволяє це працювати в декількох сценаріях (це також дозволить повернути інформацію про локальні накопичувачі машини).

Для того, щоб він працював як на локальних, так і на картографічних накопичувачах, порівняння робиться для заповнення $ root за допомогою букви диска або мережі. .Root відправить лист диска, а .DisplayRoot поверне мережевий шлях (нульовий, якщо це локальний шлях, що є причиною порівняння)

Використовуючи Join-Path, ви зможете об'єднати шлях, який поверне букву диска та поточне місце розташування, якщо це локальний шлях, мережевий шлях та поточне розташування, якщо це зіставлений диск.


Поясніть, як це працює?
Адам

1
Додано пояснення - Дякую, що зателефонували.
Райан

1
Так само, як інформація, якщо ви працюєте з SharePoint. Я наніс диск на бібліотеку документів SharePoint за допомогою командлета New-PSDrive. У цьому випадку у мене є властивість диска у властивості Name, властивість Root містить шлях UNC, а властивість DisplayRoot порожнє.
pholpar

0

Тож поєднуючи найкращі відповіді тут, в однострої; Тести на поточний шлях як UNC, відображають привід на поточний шлях, змінюють новий накопичений привід, якщо вже картографічний диск, жодних дій не буде вжито.

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}

Не призначений відповідати на ОП, просто додайте корисний контент. Був сценарій, що мені потрібен картографічний диск замість контурів UNC, тому я зробив це, щоб перевірити, чи UNC використовується у PS, а потім перенести на диск, використовуючи цей шлях UNC, а потім перейти на цю літеру диска.


-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
Чи ви можете детальніше розглянути, що робить цей код? Будь ласка, подивіться, як відповісти та здійснити нашу екскурсію .
Бургі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.