참고 : PowerShell 1.0
현재 실행중인 PowerShell 파일 이름을 얻고 싶습니다. 즉, 다음과 같이 세션을 시작하면 :
powershell.exe .\myfile.ps1
문자열 “. \ myfile.ps1” (또는 이와 유사한 것) 을 얻고 싶습니다 . 편집 : “myfile.ps1” 이 바람직합니다.
어떤 아이디어?
답변
여기에 PowerShell 5 용으로 업데이트 된 다양한 답변을 요약하려고했습니다.
-
PowerShell 3 이상 만 사용하는 경우
$PSCommandPath
-
이전 버전과의 호환성을 원하면 shim을 삽입하십시오.
if ($PSCommandPath -eq $null) { function GetPSCommandPath() { return $MyInvocation.PSCommandPath; } $PSCommandPath = GetPSCommandPath; }
$PSCommandPath
이미 존재하지 않는 경우 추가 됩니다.shim 코드는 어디에서나 (최상위 수준 또는 함수 내부) 실행할 수 있지만
$PSCommandPath
변수에는 일반적인 범위 지정 규칙이 적용됩니다 (예 : 함수에 shim을 넣는 경우 변수의 범위는 해당 함수로만 지정됨).
세부
다양한 답변에 사용되는 4 가지 방법이 있으므로 각각을 설명하기 위해이 스크립트를 작성했습니다 $PSCommandPath
.
function PSCommandPath() { return $PSCommandPath; }
function ScriptName() { return $MyInvocation.ScriptName; }
function MyCommandName() { return $MyInvocation.MyCommand.Name; }
function MyCommandDefinition() {
# Begin of MyCommandDefinition()
# Note: ouput of this script shows the contents of this function, not the execution result
return $MyInvocation.MyCommand.Definition;
# End of MyCommandDefinition()
}
function MyInvocationPSCommandPath() { return $MyInvocation.PSCommandPath; }
Write-Host "";
Write-Host "PSVersion: $($PSVersionTable.PSVersion)";
Write-Host "";
Write-Host "`$PSCommandPath:";
Write-Host " * Direct: $PSCommandPath";
Write-Host " * Function: $(ScriptName)";
Write-Host "";
Write-Host "`$MyInvocation.ScriptName:";
Write-Host " * Direct: $($MyInvocation.ScriptName)";
Write-Host " * Function: $(ScriptName)";
Write-Host "";
Write-Host "`$MyInvocation.MyCommand.Name:";
Write-Host " * Direct: $($MyInvocation.MyCommand.Name)";
Write-Host " * Function: $(MyCommandName)";
Write-Host "";
Write-Host "`$MyInvocation.MyCommand.Definition:";
Write-Host " * Direct: $($MyInvocation.MyCommand.Definition)";
Write-Host " * Function: $(MyCommandDefinition)";
Write-Host "";
Write-Host "`$MyInvocation.PSCommandPath:";
Write-Host " * Direct: $($MyInvocation.PSCommandPath)";
Write-Host " * Function: $(MyInvocationPSCommandPath)";
Write-Host "";
산출:
PS C:\> .\Test\test.ps1
PSVersion: 5.1.19035.1
$PSCommandPath:
* Direct: C:\Test\test.ps1
* Function: C:\Test\test.ps1
$MyInvocation.ScriptName:
* Direct:
* Function: C:\Test\test.ps1
$MyInvocation.MyCommand.Name:
* Direct: test.ps1
* Function: MyCommandName
$MyInvocation.MyCommand.Definition:
* Direct: C:\Test\test.ps1
* Function:
# Begin of MyCommandDefinition()
# Note this is the contents of the MyCommandDefinition() function, not the execution results
return $MyInvocation.MyCommand.Definition;
# End of MyCommandDefinition()
$MyInvocation.PSCommandPath:
* Direct:
* Function: C:\Test\test.ps1
노트:
- 에서 실행
C:\
되지만 실제 스크립트는C:\Test\test.ps1
. - 전달 된 호출 경로 (
.\Test\test.ps1
)를 알려주는 메서드가 없습니다. $PSCommandPath
유일한 신뢰할 수있는 방법이지만 PowerShell 3에서 도입되었습니다.- 3 이전 버전의 경우 함수 내부 및 외부에서 단일 메서드가 작동하지 않습니다.
답변
대부분의 경우 현재 답변이 맞지만 정답을 제공하지 못하는 특정 상황이 있습니다. 스크립트 함수 내에서 사용하는 경우 :
$MyInvocation.MyCommand.Name
스크립트 이름 대신 함수 이름을 반환합니다.
function test {
$MyInvocation.MyCommand.Name
}
스크립트 이름에 관계없이 ” test “를 제공합니다 . 스크립트 이름을 얻기위한 올바른 명령은 항상
$MyInvocation.ScriptName
실행중인 스크립트의 전체 경로를 반환합니다. 이 코드가 도움이 될 것보다 스크립트 파일 이름 만 필요한 경우 :
split-path $MyInvocation.PSCommandPath -Leaf
답변
전체 경로가 아닌 파일 이름 만 원하면 다음을 사용하십시오.
$ScriptName = $MyInvocation.MyCommand.Name
답변
다음을 시도하십시오
$path = $MyInvocation.MyCommand.Definition
이것은 입력 된 실제 경로를 제공하지 않을 수 있지만 파일에 대한 유효한 경로를 제공합니다.
답변
스크립트가 실행되는 현재 디렉토리를 찾고 있다면 다음을 시도해 볼 수 있습니다.
$fullPathIncFileName = $MyInvocation.MyCommand.Definition
$currentScriptName = $MyInvocation.MyCommand.Name
$currentExecutingPath = $fullPathIncFileName.Replace($currentScriptName, "")
Write-Host $currentExecutingPath
답변
주의 : $PSScriptRoot
및 $PSCommandPath
자동 변수 와 달리 자동 변수의
PSScriptRoot
및 PSCommandPath
속성 $MyInvocation
에는 현재 스크립트가 아닌 호출자 또는 호출 스크립트에 대한 정보가 포함됩니다.
예 :
PS C:\Users\S_ms\OneDrive\Documents> C:\Users\SP_ms\OneDrive\Documents\DPM ...
=!C:\Users\S_ms\OneDrive\Documents\DPM.ps1
… DPM.ps1
포함하는 곳
Write-Host ("="+($MyInvocation.PSCommandPath)+"!"+$PSCommandPath)
답변
변수 $ MyInvocation.MyCommand.Path의 범위를 설정하여 더 나은 방법이 있다고 주장합니다.
예> $ 스크립트 : MyInvocation.MyCommand.Name
이 메서드는 모든 호출 상황에서 작동합니다.
예 : Somescript.ps1
function printme () {
"In function:"
( "MyInvocation.ScriptName: " + [string]($MyInvocation.ScriptName) )
( "script:MyInvocation.MyCommand.Name: " + [string]($script:MyInvocation.MyCommand.Name) )
( "MyInvocation.MyCommand.Name: " + [string]($MyInvocation.MyCommand.Name) )
}
"Main:"
( "MyInvocation.ScriptName: " + [string]($MyInvocation.ScriptName) )
( "script:MyInvocation.MyCommand.Name: " + [string]($script:MyInvocation.MyCommand.Name) )
( "MyInvocation.MyCommand.Name: " + [string]($MyInvocation.MyCommand.Name) )
" "
printme
exit
산출:
PS> powershell C:\temp\test.ps1
Main:
MyInvocation.ScriptName:
script:MyInvocation.MyCommand.Name: test.ps1
MyInvocation.MyCommand.Name: test.ps1
In function:
MyInvocation.ScriptName: C:\temp\test.ps1
script:MyInvocation.MyCommand.Name: test.ps1
MyInvocation.MyCommand.Name: printme
위의 수락 된 답변이 Main에서 호출 될 때 값을 반환하지 않는 방법에 유의하십시오. 또한 질문이 스크립트 이름 만 요청한 경우 위의 수락 된 답변은 전체 경로를 반환합니다. 범위 변수는 모든 위치에서 작동합니다.
또한 전체 경로를 원하면 다음을 호출하면됩니다.
$script:MyInvocation.MyCommand.Path