답변:
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 스크립트에 관심이있는 사람은 다음과 같습니다.
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 사용)로 여러 개의 장면에서 작동 할 수 있도록 Name 매개 변수를 전달합니다. (이것은 또한 머신의 로컬 드라이브에 대한 정보를 가져옵니다).
로컬 드라이브와 매핑 된 드라이브 모두에서 작동하도록하기 위해 드라이브 문자 나 네트워크 위치로 $ root를 채우는 비교가 수행됩니다. .Root는 드라이브 문자를 다시 전송하고 .DisplayRoot는 네트워크 경로를 되돌립니다 (로컬 경로 인 경우 널 (null)이므로 비교 이유).
Join-Path를 사용하면 경로를 함께 가져와 드라이브 문자와 현재 위치가 로컬 경로 인 경우 네트워크 경로 및 매핑 된 드라이브 인 경우 현재 위치를 반환합니다.
여기에 가장 좋은 답변을 하나의 라이너로 결합하십시오. 현재 경로를 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 경로를 사용하여 드라이브에 매핑 한 다음 해당 드라이브 문자로 전환하십시오.
$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