Nhận đường dẫn UNC hiện tại từ một đường dẫn cục bộ trong powershell


10

Giả sử tôi có một ổ đĩa được ánh xạ M:\tới \\SomeServer\SomeSharevà trong powershell Tôi đang ở trong thư mục, M:\SomeFolderlàm thế nào để tôi chuyển đổi nó thành một đường dẫn UNC, tức là \\SomeServer\SomeShare\SomeFolder.


Có nên vào stackoverflow?
muỗng16

Câu trả lời:


14

Tôi khá mới với PowerShell, vì vậy mã dưới đây có thể kém chất lượng. Tuy nhiên, cần có thông tin bạn muốn:

$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)

$ unsPath nên chứa đường dẫn UNC mà bạn đang tìm kiếm.


Cảm ơn rất nhiều, điều đó hoạt động hoàn hảo. Tôi cũng đã sửa đổi nó một chút để hoạt động với các đường dẫn cục bộ, điều này sẽ khắc phục các sự cố khó chịu của tôi với StExBar + runas + powershell thành một ổ đĩa được ánh xạ.
Chris Chilvers

@firedfly, làm thế nào điều này cần phải được thay đổi để hỗ trợ các ổ đĩa cục bộ (ví dụ `C:`)? Có lẽ cần phải bao gồm tên của máy, nhưng tôi không biết người ta sẽ phân biệt giữa ổ đĩa cứng và ổ đĩa CD / DVD như thế nào.
Craig

4

Đối với bất kỳ ai quan tâm đến tập lệnh RunAs cho StExBar, đó là:

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

Và dòng lệnh trong StExBar là:

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

Thay thế đường dẫn bằng bất cứ nơi nào bạn giữ tập lệnh RunAs.ps1, tôi muốn lưu trữ của tôi trong thư mục gốc của tôi.


3

Tôi biết đây là một câu hỏi cũ, nhưng trong trường hợp ai đó cần phiên bản một dòng này:

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

Lưu ý điều này chỉ hoạt động nếu bạn thực sự đang ở trên đường dẫn mạng được ánh xạ ổ đĩa. Nếu bạn đang trên một đường dẫn cục bộ, CarrierName là null; nếu bạn đang ở trên đường dẫn mạng không được ánh xạ ổ đĩa, Drive sẽ không có giá trị. Nếu bạn cần phân biệt giữa 3 trường hợp này, một lớp lót sẽ không cắt nó.
Timbo

3

Tôi nhận ra đây là một câu hỏi cũ, nhưng tôi muốn chia sẻ một cách khác để thực hiện điều này:

$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 sẽ lấy lại tất cả thông tin về một ổ đĩa (tên, không gian đã sử dụng / không gian trống, nhà cung cấp, vị trí gốc và vị trí hiện tại) và truyền tham số Tên dưới dạng ký tự ổ đĩa hiện tại (sử dụng get-location) cho phép nó hoạt động trong nhiều khung cảnh (điều này cũng sẽ lấy lại thông tin về các ổ đĩa cục bộ trên máy).

Để làm cho nó hoạt động trên cả ổ đĩa cục bộ và ánh xạ, việc so sánh được thực hiện để điền $ root với ký tự ổ đĩa hoặc vị trí mạng. .Root sẽ gửi lại ký tự ổ đĩa và .DisplayRoot sẽ kéo lại đường dẫn mạng (null nếu đó là đường dẫn cục bộ, đó là lý do để so sánh)

Sử dụng Đường dẫn tham gia, sau đó bạn có thể kết hợp đường dẫn, sẽ trả về ký tự ổ đĩa và vị trí hiện tại nếu đó là đường dẫn cục bộ, đường dẫn mạng và vị trí hiện tại nếu đó là ổ đĩa được ánh xạ.


Giải thích nó hoạt động như thế nào?
Adam

1
Thêm giải thích - Cảm ơn đã gọi ra.
Ryan

1
Cũng như thông tin nếu bạn đang làm việc với SharePoint. Tôi đã ánh xạ ổ đĩa tới thư viện tài liệu SharePoint bằng lệnh ghép ngắn New-PSDrive. Trong trường hợp này tôi có ký tự ổ đĩa trong thuộc tính Name, thuộc tính Root chứa đường dẫn UNC và thuộc tính DisplayRoot trống.
pholpar

0

Vì vậy, kết hợp tốt nhất của các câu trả lời ở đây thành một lót; Kiểm tra đường dẫn hiện tại là UNC, ánh xạ ổ đĩa sang đường dẫn hiện tại, thay đổi ổ đĩa được ánh xạ mới, nếu đã là ổ đĩa được ánh xạ, sẽ không có hành động nào được thực hiện.

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}

Không có ý định trả lời OP, chỉ cần thêm nội dung hữu ích. Có một tập lệnh mà tôi cần ánh xạ ổ đĩa thay vì đường dẫn UNC, vì vậy tôi đã làm điều này để kiểm tra xem UNC có được sử dụng trong PS không, sau đó ánh xạ tới ổ đĩa bằng đường dẫn UNC đó, sau đó chuyển sang ký tự ổ đĩa đó.


-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
Coul bạn giải thích về những gì mã này làm gì? Xin vui lòng xem Làm thế nào để trả lời và đi tour của chúng tôi .
Burgi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.