Powershell의 로컬 경로에서 현재 UNC 경로 가져 오기


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의 성가신 문제를 매핑 된 드라이브로 수정해야합니다.
Chris Chilvers

@firedfly, 로컬 드라이브를 지원하기 위해 어떻게 변경해야합니까 (예 :`C :`)? 아마도 기계 이름을 포함해야하지만 HDD와 CD / DVD 드라이브를 어떻게 구분할 수 있을지 모르겠습니다.
Craig

4

StExBar의 RunAs 스크립트에 관심이있는 사람은 다음과 같습니다.

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은 null입니다. 드라이브 매핑되지 않은 네트워크 경로에있는 경우 드라이브가 null입니다. 이 세 가지 경우를 구별 해야하는 경우 한 줄짜리로 잘라낼 수 없습니다.
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 사용)로 여러 개의 장면에서 작동 할 수 있도록 Name 매개 변수를 전달합니다. (이것은 또한 머신의 로컬 드라이브에 대한 정보를 가져옵니다).

로컬 드라이브와 매핑 된 드라이브 모두에서 작동하도록하기 위해 드라이브 문자 나 네트워크 위치로 $ root를 채우는 비교가 수행됩니다. .Root는 드라이브 문자를 다시 전송하고 .DisplayRoot는 네트워크 경로를 되돌립니다 (로컬 경로 인 경우 널 (null)이므로 비교 이유).

Join-Path를 사용하면 경로를 함께 가져와 드라이브 문자와 현재 위치가 로컬 경로 인 경우 네트워크 경로 및 매핑 된 드라이브 인 경우 현재 위치를 반환합니다.


어떻게 작동하는지 설명하시오?
Adam

1
설명 추가-전화 해 주셔서 감사합니다.
Ryan

1
SharePoint로 작업하는 경우 정보처럼. New-PSDrive cmdlet을 사용하여 드라이브를 SharePoint 문서 라이브러리에 매핑했습니다. 이 경우 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}

OP에 대답하기위한 것이 아니라 유용한 내용을 추가하십시오. UNC 경로 대신 매핑 된 드라이브가 필요한 스크립트가 있었으므로 PS에서 UNC가 사용되고 있는지 확인한 다음 해당 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
이 코드의 기능에 대해 자세히 설명해 드리겠습니다 답변 방법둘러보기 참조하십시오 .
버기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.