รับเส้นทาง UNC ปัจจุบันจากเส้นทางท้องถิ่นใน PowerShell


10

สมมติว่าฉันมีไดรฟ์ที่แมปM:\ไป\\SomeServer\SomeShareและใน PowerShell ฉันอยู่ในโฟลเดอร์M:\SomeFolderฉันจะแปลงให้เป็นเส้นทาง UNC \\SomeServer\SomeShare\SomeFolderได้อย่างไร


ควรอยู่ใน stackoverflow หรือไม่
Spoon16

คำตอบ:


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 + powershell ไปยังไดรฟ์ที่แมป
คริส Chilvers

@firedfly ต้องมีการแก้ไขอย่างไรเพื่อสนับสนุนไดรฟ์ในเครื่อง (เช่น `C:`) มันอาจจะต้องรวมชื่อของเครื่อง แต่ฉันไม่รู้ว่าจะแยกความแตกต่างระหว่างไดรฟ์ HDD และ CD / DVD ได้อย่างไร
Craig

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 กรณีนี้หนึ่งซับจะไม่ตัด
Timbo

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 จะดึงข้อมูลทั้งหมดที่เกี่ยวกับไดรฟ์ (ชื่อ, พื้นที่ว่าง / ที่ใช้, ผู้ให้บริการ, ตำแหน่งรูทและปัจจุบัน) และส่งผ่านพารามิเตอร์ชื่อเป็นตัวอักษรไดรฟ์ปัจจุบัน (โดยใช้ get-location) (สิ่งนี้จะดึงข้อมูลในไดรฟ์ภายในเครื่อง)

เพื่อให้มันทำงานได้ทั้งบนโลคัลและแมปไดรฟ์ทำการเปรียบเทียบเพื่อเติม $ root ด้วยตัวอักษรของไดรฟ์หรือตำแหน่งเครือข่าย .Root จะส่งตัวอักษรของไดรฟ์กลับมาและ. DisplayRoot จะดึงเส้นทางเครือข่ายกลับมา (null ถ้ามันเป็นเส้นทางท้องถิ่นซึ่งเป็นเหตุผลสำหรับการเปรียบเทียบ)

ใช้การเข้าร่วมเส้นทางจากนั้นคุณสามารถดึงเส้นทางเข้าด้วยกันซึ่งจะส่งคืนอักษรระบุไดรฟ์และตำแหน่งปัจจุบันหากเป็นเส้นทางภายในเครื่องเส้นทางเครือข่ายและตำแหน่งปัจจุบันหากเป็นแผนที่ที่มีการแมป


อธิบายว่ามันทำงานอย่างไร
อดัม

1
เพิ่มคำอธิบาย - ขอบคุณที่โทรออก
Ryan

1
เช่นเดียวกับข้อมูลถ้าคุณทำงานกับ SharePoint ฉันแมปไดรฟ์กับไลบรารีเอกสาร SharePoint โดยใช้ New-PSDrive cmdlet ในกรณีนี้ฉันมีอักษรระบุไดรฟ์ในชื่อคุณสมบัติคุณสมบัติรูทประกอบด้วยเส้นทาง 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}

ไม่ได้ตั้งใจตอบ OP เพียงเพิ่มเนื้อหาที่มีประโยชน์ มีสคริปต์ที่ฉันต้องการแมปไดรฟ์แทนเส้นทาง 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
คุณคิดว่าโค้ดนี้ทำอะไรได้บ้าง? โปรดดูวิธีการตอบและใช้เวลาของเราเกี่ยวกับการท่องเที่ยว
Burgi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.