[powershell] 실행중인 cmdlet의 현재 디렉터리를 가져 오는 방법

이 작업은 간단한 작업이지만 실행 된 cmdlet이 성공적으로 위치한 디렉터리의 경로를 얻는 방법에 대한 몇 가지 시도를 보았습니다. 예를 들어, C:\temp\myscripts\mycmdlet.ps1설정 파일이있는 실행 파일에서 변수 C:\temp\myscripts\settings.xml를 저장할 수 있기를 원합니다 .C:\temp\myscriptsmycmdlet.ps1

이것은 작동하는 하나의 솔루션입니다 (약간 번거롭지 만).

$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path
$settingspath = $directorypath + '\settings.xml'

다른 하나는 테스트 환경에서만 작동하는이 솔루션을 제안했습니다.

$settingspath = '.\settings.xml'

나는 후자의 접근법을 많이 좋아하고 매번 파일 경로를 매개 변수로 파싱하는 것을 선호하지만 개발 환경에서 작동하도록 할 수는 없습니다. 어떻게해야합니까? PowerShell 구성 방법과 관련이 있습니까?



답변

이를 수행하는 신뢰할 수있는 방법은 당신이 보여준 것과 같습니다 $MyInvocation.MyCommand.Path.

상대 경로 사용은 PowerShell의 $ pwd, 응용 프로그램의 현재 디렉토리 또는 .NET API의 현재 작업 디렉토리를 기반으로합니다.

PowerShell v3 + :

자동 변수를 사용하십시오 $PSScriptRoot.


답변

그렇습니다. 그러나 절대 경로를 볼 필요가 있으면 이것이 전부입니다.

(Get-Item -Path ".\").FullName


답변

가장 쉬운 방법은 다음과 같은 사전 정의 된 변수를 사용하는 것 같습니다.

 $PSScriptRoot

about_Automatic_Variables그리고 about_Scripts두 상태 :

PowerShell 2.0에서이 변수는 스크립트 모듈 (.psm1)에서만 유효합니다. PowerShell 3.0부터는 모든 스크립트에서 유효합니다.

나는 이것을 다음과 같이 사용한다 :

 $MyFileName = "data.txt"
 $filebase = Join-Path $PSScriptRoot $MyFileName


답변

다음을 사용할 수도 있습니다.

(Resolve-Path .\).Path

괄호 안의 부분은 PathInfo객체를 반환 합니다.

PowerShell 2.0부터 사용 가능합니다.


답변

경로는 종종 null입니다. 이 기능은 더 안전합니다.

function Get-ScriptDirectory
{
    $Invocation = (Get-Variable MyInvocation -Scope 1).Value;
    if($Invocation.PSScriptRoot)
    {
        $Invocation.PSScriptRoot;
    }
    Elseif($Invocation.MyCommand.Path)
    {
        Split-Path $Invocation.MyCommand.Path
    }
    else
    {
        $Invocation.InvocationName.Substring(0,$Invocation.InvocationName.LastIndexOf("\"));
    }
}


답변

시도 :

(Get-Location).path

또는:

($pwd).path


답변

Get-Location 현재 위치를 반환합니다 :

$Currentlocation = Get-Location