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