สมมติว่าฉันมีไดรฟ์ที่แมปM:\
ไป\\SomeServer\SomeShare
และใน PowerShell ฉันอยู่ในโฟลเดอร์M:\SomeFolder
ฉันจะแปลงให้เป็นเส้นทาง UNC \\SomeServer\SomeShare\SomeFolder
ได้อย่างไร
สมมติว่าฉันมีไดรฟ์ที่แมปM:\
ไป\\SomeServer\SomeShare
และใน PowerShell ฉันอยู่ในโฟลเดอร์M:\SomeFolder
ฉันจะแปลงให้เป็นเส้นทาง UNC \\SomeServer\SomeShare\SomeFolder
ได้อย่างไร
คำตอบ:
ฉันค่อนข้างใหม่กับ 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 ที่คุณต้องการ
สำหรับผู้ที่สนใจสคริปต์ 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 เอาไว้ฉันชอบเก็บของไว้ในรูทของโฟลเดอร์บ้านของฉัน
ฉันรู้ว่านี่เป็นคำถามเก่า แต่ในกรณีที่มีคนต้องการรุ่นหนึ่งบรรทัดนี้:
$unc = (gwmi Win32_LogicalDisk -filter "DeviceID = '$((Get-Location).Drive.Name):'").ProviderName
ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันต้องการแบ่งปันวิธีอื่นในการทำสิ่งนี้:
$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 ถ้ามันเป็นเส้นทางท้องถิ่นซึ่งเป็นเหตุผลสำหรับการเปรียบเทียบ)
ใช้การเข้าร่วมเส้นทางจากนั้นคุณสามารถดึงเส้นทางเข้าด้วยกันซึ่งจะส่งคืนอักษรระบุไดรฟ์และตำแหน่งปัจจุบันหากเป็นเส้นทางภายในเครื่องเส้นทางเครือข่ายและตำแหน่งปัจจุบันหากเป็นแผนที่ที่มีการแมป
ดังนั้นการรวมคำตอบที่ดีที่สุดไว้ในที่เดียว ทดสอบพา ธ ปัจจุบันเป็น 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 นั้นจากนั้นสลับไปที่อักษรระบุไดรฟ์นั้น
$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