Programing

현재 PowerShell 스크립트의 위치를 ​​확인하는 가장 좋은 방법은 무엇입니까?

lottogame 2020. 2. 14. 23:22
반응형

현재 PowerShell 스크립트의 위치를 ​​확인하는 가장 좋은 방법은 무엇입니까?


공통 모듈이나 스크립트를 참조해야 할 때마다 현재 스크립트 파일에 상대적인 경로를 사용하고 싶습니다. 이런 식으로 스크립트는 항상 라이브러리에서 다른 스크립트를 찾을 수 있습니다.

그렇다면 현재 스크립트의 디렉토리를 결정하는 가장 좋은 표준 방법은 무엇입니까? 현재, 나는하고있다 :

$MyDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)

모듈 (.psm1) $PSScriptRoot에서이 정보를 얻는 데 사용할 수 있지만 일반 스크립트 (예 : .ps1 파일)에서는 설정되지 않습니다.

현재 PowerShell 스크립트 파일의 위치를 ​​얻는 정식 방법은 무엇입니까?


PowerShell 3 이상

# This is an automatic variable set to the current file's/module's directory
$PSScriptRoot

PowerShell 2

PowerShell 3 이전에는 MyInvocation.MyCommand.Definition일반 스크립트 속성을 쿼리하는 것보다 더 좋은 방법은 없었습니다 . 필자가 가지고있는 모든 powershell 스크립트의 맨 위에 다음 줄이 있습니다.

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition

V2 모듈을 작성하는 경우라는 자동 변수를 사용할 수 있습니다 $PSScriptRoot.

PS> Help automatic_variable에서

$ PSScriptRoot
       스크립트 모듈이 실행되는 디렉토리를 포함합니다.
       이 변수를 사용하면 스크립트가 모듈 경로를 사용하여 다른 경로에 액세스 할 수 있습니다
       자원.

PowerShell 3.0의 경우

$PSCommandPath
    Contains the full path and file name of the script that is being run. 
    This variable is valid in all scripts.

그러면 기능은 다음과 같습니다.

function Get-ScriptDirectory {
    Split-Path -Parent $PSCommandPath
}

Powershell 3 이상

function Get-ScriptDirectory {
    if ($psise) {Split-Path $psise.CurrentFile.FullPath}
    else {$global:PSScriptRoot}
}

이 기능을 내 프로필에 넣었습니다. F8 / Run Selection을 사용하여 ISE에서도 작동합니다.


어쩌면 나는 여기에 뭔가 빠져있을 것입니다 ... 그러나 현재 작업 디렉토리를 원한다면 이것을 (Get-Location).Path문자열 또는 Get-Location객체로 사용할 수 있습니다.

당신이 이와 같은 것을 언급하지 않는 한, 나는 질문을 다시 읽은 후에 이해합니다.

function Get-Script-Directory
{
    $scriptInvocation = (Get-Variable MyInvocation -Scope 1).Value
    return Split-Path $scriptInvocation.MyCommand.Path
}

이미 게시 된 답변과 매우 유사하지만 배관은 PS와 유사 해 보입니다.

$PSCommandPath | Split-Path -Parent

자동 변수 $ ExecutionContext를 사용하며 PowerShell 2 이상에서 작동합니다.

$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath('.\')

$ ExecutionContext Windows PowerShell 호스트의 실행 컨텍스트를 나타내는 EngineIntrinsics 개체가 포함되어 있습니다. 이 변수를 사용하여 cmdlet에 사용할 수있는 실행 개체를 찾을 수 있습니다.


스크립트 이름과 실행 위치를 알아야했습니다.

MyInvocation 구조의 접두어 "$ global :"은 기본 스크립트와 가져온 .PSM1 라이브러리 파일의 기본 행에서 호출 될 때 전체 경로와 스크립트 이름을 반환합니다. 또한 가져온 라이브러리의 함수 내에서 작동합니다.

많은 문제를 겪은 후 $ global : MyInvocation.InvocationName을 사용하여 정착했습니다. CMD 실행, Run With Powershell 및 ISE와 안정적으로 작동합니다. 로컬 및 UNC 실행 모두 올바른 경로를 반환합니다.


받아 들인 대답을 취하여 강력한 기능으로 바꾸는 무언가를 개발하는 데 시간이 걸렸습니다.

다른 사람들에 대해서는 확실하지 않지만 PowerShell 버전 2와 3 모두에서 컴퓨터가있는 환경에서 작업하므로 둘 다 처리해야했습니다. 다음 함수는 우아한 폴백을 제공합니다.

Function Get-PSScriptRoot
{
    $ScriptRoot = ""

    Try
    {
        $ScriptRoot = Get-Variable -Name PSScriptRoot -ValueOnly -ErrorAction Stop
    }
    Catch
    {
        $ScriptRoot = Split-Path $script:MyInvocation.MyCommand.Path
    }

    Write-Output $ScriptRoot
}

또한이 기능은 블로그 에서 Michael Sorens가 설명한 부모의 범위가 아니라 스크립트 범위를 나타냅니다.


나는 항상이 간단한 코드 조각을 Powershell과 ISE에서 같은 방식으로 사용합니다.

# set active path to script-location:
$path = $MyInvocation.MyCommand.Path
if (!$path) {$path = $psISE.CurrentFile.Fullpath}
if ( $path) {$path = split-path $path -Parent}
set-location $path

split-path -parent $psISE.CurrentFile.Fullpath다른 방법 중 하나라도 실패하면 고려할 수도 있습니다 . 특히 파일을 실행하여 많은 함수를로드 한 다음 ISE 셸에서 해당 함수를 실행하면 (또는 선택한 경우) Get-Script-Directory위와 같은 기능이 작동하지 않는 것 같습니다 .


여기에 게시 된 이전 솔루션이 PowerShell V5에서 작동하지 않는 것으로 나타났습니다. 나는 이것을 생각해 냈다.

try {
    $scriptPath = $PSScriptRoot
    if (!$scriptPath)
    {
        if ($psISE)
        {
            $scriptPath = Split-Path -Parent -Path $psISE.CurrentFile.FullPath
        } else {
            Write-Host -ForegroundColor Red "Cannot resolve script file's path"
            exit 1
        }
    }
} catch {
    Write-Host -ForegroundColor Red "Caught Exception: $($Error[0].Exception.Message)"
    exit 2
}

Write-Host "Path: $scriptPath"

HTH


function func1() 
{
   $inv = (Get-Variable MyInvocation -Scope 1).Value
   #$inv.MyCommand | Format-List *   
   $Path1 = Split-Path $inv.scriptname
   Write-Host $Path1
}

function Main()
{
    func1
}

Main

참고 URL : https://stackoverflow.com/questions/5466329/whats-the-best-way-to-determine-the-location-of-the-current-powershell-script



반응형