현재 PowerShell 스크립트의 위치를 확인하는 가장 좋은 방법은 무엇입니까?
공통 모듈이나 스크립트를 참조해야 할 때마다 현재 스크립트 파일에 상대적인 경로를 사용하고 싶습니다. 이런 식으로 스크립트는 항상 라이브러리에서 다른 스크립트를 찾을 수 있습니다.
그렇다면 현재 스크립트의 디렉토리를 결정하는 가장 좋은 표준 방법은 무엇입니까? 현재, 나는하고있다 :
$MyDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)
모듈 (.psm1) $PSScriptRoot
에서이 정보를 얻는 데 사용할 수 있지만 일반 스크립트 (예 : .ps1 파일)에서는 설정되지 않습니다.
현재 PowerShell 스크립트 파일의 위치를 얻는 정식 방법은 무엇입니까?
# 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
'Programing' 카테고리의 다른 글
2D 점이 다각형 내에 있는지 어떻게 알 수 있습니까? (0) | 2020.02.15 |
---|---|
항목 x에 액세스 할 수 있도록 문자열을 어떻게 분할합니까? (0) | 2020.02.14 |
"?"후에 GET 매개 변수에 액세스하는 방법 (0) | 2020.02.14 |
텍스트 필드를 탐색하는 방법 (다음 / 완료 단추) (0) | 2020.02.14 |
현재 작업 디렉토리를 스크립트의 디렉토리로 설정하는 방법은 무엇입니까? (0) | 2020.02.14 |