게 찾을 수 있는 방법 원본 경로는 실행하는 스크립트를 사용해야 할까요?[중복]

StackOverflow https://stackoverflow.com/questions/801967

  •  03-07-2019
  •  | 
  •  

문제

고 싶은 말할 수있는 경로는 나를 실행하는 스크립트 실행되었습니다.
이것은 자주는 아니지만 될$pwd.

해 호출의 다른 스크립트 폴더 구조에서 상대적인 스크립트와 동안 수 있는 하드드로의 경로는 모두의 입맛의 비트에 고통 때 목을 촉진하기 위해 노력하고에서"dev""테스트하는""생산".

도움이 되었습니까?

해결책

유비쿼터스 스크립트가 원래 의해 배치 제프리 Snover PowerShell 팀(진 브의 응답 다)및 변형 게시 키스 Cedirc 및 EBGreen,모든 고통에서 심각한 단점--지 코드를 보고 무엇을 기대에 따라 어디에 당신이 그것을 부!

내 코드는 아래에 극복하여 이 문제는 단순히 참조 스크립트 범위에 대 범위:

function Get-ScriptDirectory
{
    Split-Path $script:MyInvocation.MyCommand.Path
}

문제를 설명하기 위해,나를 만들었을 테스트하는 차량 evalutes 대상식에서 네 개의 다른 방법이 있습니다.(대괄호로 묶은 용어를 사용하여 다음과 같은 결과를 테이블.)

  1. 인라인 코드[인라인]
  2. 인라인 함수,즉함수에서 주요 프로그램[인라인 함수]
  3. Dot-공급기능,즉동일한 기능을 이동하는 별개입니다.ps1 파일[dot 소스]
  4. 모듈 기능을,즉동일한 기능을 이동하는 별개입니다.psm1 파일을 모듈]

마지막 두 개의 열을 보여주는 결과를 사용하여 스크립트를 범위(예:$스크립트)또는 상위 범위(과 범위 1)입니다.그 결과의"스크립트"를 의미하는 호출을 올바르게 보고의 위치는 스크립트입니다.는"모듈은"결과가 의미 호출하는 보고의 위치를 포함하는 모듈은 기능보다는 스크립트 함수를 호출;이를 나타내는 단점이 모두 기능할 수 없는 함수에서 모듈이 있다.

설정 모듈에 문제가 따라 관찰에서 테이블 를 사용하여 상위 범위 접근 방식이 실패하는 대부분의 시간 (사실,그가 성공하).

table of input combinations

마지막으로,여기에 차량 테스트:

function DoubleNested()
{
    "=== DOUBLE NESTED ==="
    NestCall
}

function NestCall()
{
    "=== NESTED ==="
    "top level:"
    Split-Path $script:MyInvocation.MyCommand.Path
    #$foo = (Get-Variable MyInvocation -Scope 1).Value
    #Split-Path $foo.MyCommand.Path
    "immediate func call"
    Get-ScriptDirectory1
    "dot-source call"
    Get-ScriptDirectory2
    "module call"
    Get-ScriptDirectory3
}

function Get-ScriptDirectory1
{
    Split-Path $script:MyInvocation.MyCommand.Path
    # $Invocation = (Get-Variable MyInvocation -Scope 1).Value
    # Split-Path $Invocation.MyCommand.Path
}

. .\ScriptDirFinder.ps1
Import-Module ScriptDirFinder -force

"top level:"
Split-Path $script:MyInvocation.MyCommand.Path
#$foo = (Get-Variable MyInvocation -Scope 1).Value
#Split-Path $foo.MyCommand.Path

"immediate func call"
Get-ScriptDirectory1
"dot-source call"
Get-ScriptDirectory2
"module call"
Get-ScriptDirectory3

NestCall
DoubleNested

의 내용을 ScriptDirFinder.ps1:

function Get-ScriptDirectory2
{
    Split-Path $script:MyInvocation.MyCommand.Path
#   $Invocation = (Get-Variable MyInvocation -Scope 1).Value
#   Split-Path $Invocation.MyCommand.Path
}

의 내용을 ScriptDirFinder.psm1:

function Get-ScriptDirectory3
{
    Split-Path $script:MyInvocation.MyCommand.Path
#   $Invocation = (Get-Variable MyInvocation -Scope 1).Value
#   Split-Path $Invocation.MyCommand.Path
}

익숙하지가 않아요 무엇으로 도입되었 PowerShell2 지만,그것은 매우 잘 스크립트 범위에 존재하지 않았 PowerShell1 시간에,제프리 Snover 게시의 예입니다.

을 때 깜짝 놀랐지만,내가 찾는 그의 코드를 들어 증식을 널리 웹에서,그것은 실패했을 때 바로 그것을 시도!그러나 그 사용했기 때문에 그것을 다르게 Snover 의 예에서(나라 그렇지에서 스크립트를 정상에서 그러나 내부에 또 다른 기능(는 나의"중첩에 두 번의 예").)

2011.09.12 업데이트

에 대해 읽을 수 있습니다 이는 다른 팁과 트릭에서 모듈에서 나 그냥 간행에 문서 Simple-Talk.com:한 토끼 구멍:PowerShell 모듈과 캡슐화.

다른 팁

당신이 태그는 당신의 질문에 대한 Powershell 버전 1.0,그러나,경우에 액세스할 수 있 Powershell 버전 3.0 당신이 알고 있는 $PSCommandPath$PSScriptRoot기 스크립트의 경로를 조금 더 쉽습니다.를 참조하십시오 "다른 스크립트 기능"섹션에 이 페이지에 대한 더 많은 정보입니다.

우리는 다음과 같은 코드를 사용하여 이의 대부분에서 스크립트를 신속하게 처리하고 몇 년 동안 아무 문제없:

#--------------------------------------------------------------------
# Dot source support scripts
#--------------------------------------------------------------------
$ScriptPath = $MyInvocation.MyCommand.Path
$ScriptDir  = Split-Path -Parent $ScriptPath
. $ScriptDir\BuildVars.ps1
. $ScriptDir\LibraryBuildUtils.ps1
. $ScriptDir\BuildReportUtils.ps1

내가 달렸으로 동일한 문제였습니다.다음과 같은 문서 나를 도와 문제를 해결하는: http://blogs.msdn.com/powershell/archive/2007/06/19/get-scriptdirectory.aspx

관심이 없는 경우에는 어떻게 작동하는지,여기의 모든 필요한 코드별 기사:

function Get-ScriptDirectory
{
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
Split-Path $Invocation.MyCommand.Path
}

그리고 당신은 경로를 단순히 하:

$path = Get-ScriptDirectory

나는 생각을 찾을 수 있습의 경로를 실행하는 스크립트를 사용하여

$MyInvocation.MyCommand.Path

Hope it helps!

Cédric

이것은 그 기이(내 마음에서 이상)에 PS.나는 확신이 완벽하게는 좋은 이유가 그것을 위해,그러나 그것은 여전히 나에게 이상한 것 같다.그래서:

당신은 스크립트에서만 함수에서 다음$myInvocation.InvocationName 줄 것입니다 당신의 전체 경로를 포함한 스크립트는 이름입니다.에 있는 경우 스크립트 함수 내에서 다음$myInvocation.ScriptName 을 줄 것이다 당신은 같은 것입니다.

감사 msorens!이것이 정말로 도움이 나와 내 사용자 지정 모듈이 있습니다.는 경우에 관심이 있는 사람이 자신을 만들기,여기에 어떻게 내가 구성되어 있습니다.

MyModule (folder)
 - MyModule.psd1 (help New-ModuleManifest)
 - MyScriptFile.ps1 (ps1 files are easy to test)

당신은 다음을 참조 MyScriptFile.ps1 에 MyModule.psd1.참조.ps1 에 NestedModules 배열 위치는 기능에 모듈 세션 상태를 보다는 오히려는 글로벌 세션 상태입니다.(를 작성하는 방법은 모듈을 명시)

NestedModules = @('.\MyScriptFile.ps1','.\MyOtherScriptFile.ps1')

의 콘텐츠 MyScriptFile.ps1

function Get-ScriptDirectory {
    Split-Path $script:MyInvocation.MyCommand.Path
}

try {
    Export-ModuleMember -Function "*-*"
}
catch{}

Try/잡는 오류를 숨 깁니다에서 내보내기-ModuleMember 실행하는 경우 MyScriptFile.ps1

복사 MyModule 디렉토리 경로 중 하나는 여기에서 찾을 $env:PSModulePath

PS C:\>Import-Module MyModule
PS C:\>Get-Command -Module MyModule

CommandType     Name                                               ModuleName                                                                                                                                                
-----------     ----                                               ----------                                                                                                                                                
Function        Get-ScriptDirectory                                MyModule  
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top