Powershell의 로컬 경로에서 현재 UNC 경로를 가져옵니다.

Powershell의 로컬 경로에서 현재 UNC 경로를 가져옵니다.

M:\Powershell 에 매핑된 드라이브가 있다고 가정 \\SomeServer\SomeShare하고 폴더에 있다고 가정하면 M:\SomeFolder이를 UNC 경로로 어떻게 변환합니까 \\SomeServer\SomeShare\SomeFolder?

답변1

저는 PowerShell을 처음 접했기 때문에 아래 코드의 품질이 좋지 않을 수 있습니다. 그러나 원하는 정보를 얻어야 합니다.

$currentDirectory = Get-Location
$currentDrive = Split-Path -qualifier $currentDirectory.Path
# Mapping a non-network drive? Check the DriveType enum documentation https://docs.microsoft.com/en-us/dotnet/api/system.io.drivetype?view=net-6.0
$logicalDisk = Get-CimInstance -ClassName Win32_LogicalDisk -filter "DriveType = 4 AND DeviceID = '$currentDrive'"
$uncPath = $currentDirectory.Path.Replace($currentDrive, $logicalDisk.ProviderName)

$uncPath에는 찾고 있는 UNC 경로가 포함되어야 합니다.

답변2

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

나는 이것이 오래된 질문이라는 것을 알고 있지만 이를 달성하는 다른 방법을 공유하고 싶었습니다.

$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는 드라이브에 대한 모든 정보(이름, 사용된 공간/여유 공간, 공급자, 루트 및 현재 위치)를 다시 가져오고 Name 매개 변수를 현재 드라이브 문자로 전달(get-location 사용)하여 여러 장면에서 작동할 수 있도록 합니다. (이렇게 하면 시스템의 로컬 드라이브에 대한 정보도 다시 가져옵니다).

로컬 및 매핑된 드라이브 모두에서 작동하도록 하기 위해 $root를 드라이브 문자 또는 네트워크 위치로 채우는 비교가 수행됩니다. .Root는 드라이브 문자를 다시 보내고 .DisplayRoot는 네트워크 경로를 다시 가져옵니다(비교 이유인 로컬 경로인 경우 null입니다).

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

답변4

따라서 여기에 있는 최고의 답변을 하나의 라이너로 결합합니다. 현재 경로를 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 경로를 사용하여 드라이브에 매핑한 다음 해당 드라이브 문자로 전환하기 위해 이 작업을 수행했습니다.

관련 정보