실행 중인 cmdlet의 현재 디렉토리를 가져오는 방법
이것은 간단한 작업입니다만, 실행된 cmdlet이 있는 디렉토리에의 패스를 취득하는 방법에 대해서는, 몇번이나 몇개의 시도가 있었습니다.를 들어, " " " 를 하면 " " " 가 됩니다.C:\temp\myscripts\mycmdlet.ps1
.C:\temp\myscripts\settings.xml
저장할 수 있으면 좋겠습니다.C:\temp\myscripts
부の の の within within の within mycmdlet.ps1
.
이것은 (좀 번거롭지만) 동작하는 하나의 솔루션입니다.
$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path
$settingspath = $directorypath + '\settings.xml'
또 다른 하나는 테스트 환경에서만 작동하는 다음과 같은 솔루션을 제안했습니다.
$settingspath = '.\settings.xml'
저는 후자의 방식을 매우 좋아하며 매번 파일 경로를 매개 변수로 해석하는 것보다 더 선호하지만 개발 환경에서 제대로 작동하지 않습니다.어떻게 해야 하나?PowerShell 구성 방식과 관련이 있습니까?
네, 효과가 있을 거예요.그러나 절대 경로를 확인해야 하는 경우 다음 항목만 있으면 됩니다.
(Get-Item .).FullName
신뢰할 수 있는 이 보여주신 입니다.$MyInvocation.MyCommand.Path
.
상대 경로 사용은 PowerShell의 $pwd, 애플리케이션의 현재 디렉토리 또는 의 현재 작업 디렉토리를 기반으로 합니다.NET API
PowerShell v3+:
변수 " " 를 합니다.$PSScriptRoot
.
가장 쉬운 방법은 다음과 같은 사전 정의된 변수를 사용하는 것 같습니다.
$PSScriptRoot
about_Automatic_Variables
및 양쪽 상태:
PowerShell 2.0에서 이 변수는 스크립트 모듈(.psm1)에서만 유효합니다.PowerShell 3.0부터는 모든 스크립트에서 사용할 수 있습니다.
이렇게 씁니다.
$MyFileName = "data.txt"
$filebase = Join-Path $PSScriptRoot $MyFileName
다음 항목도 사용할 수 있습니다.
(Resolve-Path .\).Path
괄호 안의 부분은 개체를 반환합니다.
(PowerShell 2.0 이후 이용 가능)
시도:
(Get-Location).path
또는 다음과 같이 입력합니다.
($pwd).path
경로가 늘인 경우가 많습니다.이 기능이 더 안전합니다.
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
는 현재 위치를 반환합니다.
$Currentlocation = Get-Location
$scriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
이것을 시험해 보세요.
$WorkingDir = Convert-Path .
Powershell 3 이상에서는 간단하게
$PSScriptRoot
현재 디렉토리의 이름만 필요한 경우 다음과 같은 작업을 수행할 수 있습니다.
((Get-Location) | Get-Item).Name
C에서 작업하는 경우:\Temp\Location\MyWorkingDirectory>
산출량
마이워킹 디렉토리
대부분의 응답은 다음 IDE에서 디버깅할 때 작동하지 않습니다.
- PS-ISE(PowerShell ISE)
- VS 코드(Visual Studio 코드)
그 안에 건$PSScriptRoot
비어 있습니다.Resolve-Path .\
(및 similars)로 인해 잘못된 경로가 생성됩니다.
프리키딘의 답변만이 그 상황을 해결할 수 있는 유일한 방법이라 제가 찬성표를 던졌지만Set-Location
그 답변이 정말 원하는 것입니다.그래서 그걸 고쳐서 코드를 좀 더 명확하게 만들었어요.
$directorypath = if ($PSScriptRoot) { $PSScriptRoot } `
elseif ($psise) { split-path $psise.CurrentFile.FullPath } `
elseif ($psEditor) { split-path $psEditor.GetEditorContext().CurrentFile.Path }
한 줄짜리 솔루션으로서 다음과 같은 솔루션이 효과적입니다.
$currFolderName = (Get-Location).Path.Substring((Get-Location).Path.LastIndexOf("\")+1)
입니다./
.
위의 게시물 덕분에 Get-Location cmdlet을 사용할 수 있습니다.
이 함수는 프롬프트 위치를 스크립트 경로로 설정하고 vscode, psise 및 pwd 사이의 스크립트 경로를 가져오는 다른 방법을 처리합니다.
function Set-CurrentLocation
{
$currentPath = $PSScriptRoot # AzureDevOps, Powershell
if (!$currentPath) { $currentPath = Split-Path $pseditor.GetEditorContext().CurrentFile.Path -ErrorAction SilentlyContinue } # VSCode
if (!$currentPath) { $currentPath = Split-Path $psISE.CurrentFile.FullPath -ErrorAction SilentlyContinue } # PsISE
if ($currentPath) { Set-Location $currentPath }
}
를 사용하면 그렇게 생각할 수 있습니다.\'는 호출 경로임을 의미합니다.하지만 항상은 아니야.예를 들어, 작업 ScriptBlock 내에서 사용하는 경우.이 경우 %profile%\를 가리킬 수 있습니다.문서.
이게 내가 생각해낸 거야.경로를 찾는 여러 방법을 포함하는 배열로, 현재 위치를 사용하고 null\empty 결과를 필터링하여 null이 아닌 첫 번째 값을 반환합니다.
@((
($MyInvocation.MyCommand.Module.ModuleBase),
($PSScriptRoot),
(Split-Path -Parent -Path $MyInvocation.MyCommand.Definition -ErrorAction SilentlyContinue),
(Get-Location | Select-Object -ExpandProperty Path)
) | Where-Object { $_ })[0]
현재 폴더 이름만 가져오려면 다음을 사용할 수도 있습니다.
(Split-Path -Path (Get-Location) -Leaf)
@Cradle의 답변을 확장하려면 OP의 질문에 따라 동일한 결과를 얻을 수 있는 다목적 함수를 작성할 수도 있습니다.
Function Get-AbsolutePath {
[CmdletBinding()]
Param(
[parameter(
Mandatory=$false,
ValueFromPipeline=$true
)]
[String]$relativePath=".\"
)
if (Test-Path -Path $relativePath) {
return (Get-Item -Path $relativePath).FullName -replace "\\$", ""
} else {
Write-Error -Message "'$relativePath' is not a valid path" -ErrorId 1 -ErrorAction Stop
}
}
PowerShell(풀 엔드 유저 GUI 애플리케이션)으로 작성된 프로그램을 만들고 있고 디스크에서 로드해야 하는 파일 및 리소스가 많기 때문에 비슷한 문제가 있었습니다.제 경험상으로는.
현재 디렉토리를 나타내는 것은 신뢰할 수 없습니다.현재 작업 디렉토리를 나타내야 하지만 그렇지 않은 경우가 많습니다. PowerShell에 내부에 저장하는 것으로 보입니다..
좀 더 정확히 말하면 PowerShell은 처음 시작할 때 기본적으로 홈 사용자 디렉토리에서 시작됩니다.입니다. 를 들어, 사용자 계정의 입니다.C:\USERS\YOUR USER NAME
그런 다음 PowerShell 프롬프트를 표시하거나 스크립트를 실행하기 전에 디렉토리를 호출한 디렉토리 또는 실행 중인 스크립트가 있는 디렉토리로 변경합니다.하지만 PowerShell 앱 자체가 원래 홈 사용자 디렉토리에서 시작된 후 발생합니다.
★★★★★★★★★★★★★★★★★..
PowerShell 。 ★★★★★★★★★★★★★★★★★..
는 원하는 디렉토리에서 PowerShell을 호출한 경우에만 현재 디렉토리를 나타냅니다.코드에서 이 PowerShell 내부에 되지 않는 것으로 ..
모든 경우에.경우에 따라서는.
는 현재 작업 디렉토리 및 PowerShell(스크립트가 아닌 자체)이 호출된 다른 디렉토리에서 일관성 없는 결과를 초래할 수 있는 항목을 나타냅니다.그래서 저는 호출기 스크립트를 사용합니다.단일 명령어가 포함된 PowerShell 스크립트:POWERSHELL
에서 PowerShell이 이 생성됩니다.
이치노그러나 나중에 PowerShell 코드에서 디렉터리를 변경하지 않는 경우에만 작동합니다.단, 호출자 스크립트는 파일옵션이 되어 있습니다.단, 호출자 스크립트는 이 포함되어 있습니다.POWERSHELL -FILE DRIVE:\PATH\SCRIPT NAME.PS1
PowerShell 이재이 。
스크립트를 클릭하기만 하면 스크립트의 위치에 관계없이 홈 사용자 디렉토리에서 PowerShell이 호출됩니다.는 PowerShell 호출 디렉토리입니다.C:\USERS\YOUR USER NAME
및와 함께, " ".
상황에 따라 이 두 개의 디렉토리 중 하나를 반환하는 것, 뭐가 우스운지.
이 스크립트를 사용하려면 , 어느쪽인가를 .$PWD
★★★★★★★★★★★★★★★★★」$PSSCRIPTROOT
.
현재 작업 디렉토리 또는 스크립트가 호출된 디렉토리를 나타내는 날씨에 따라 현재 디렉토리를 나타냅니다. 어떤 두 개의 중 .
반환, 반환을 사용할 수 .$HOME
.
개인적으로는 메인 앱 스크립트를 호출하는 PowerShell을 사용하여 개발한 앱 루트 디렉토리에 호출기 스크립트를 가지고 있기 때문에 앱의 소스 코드 내의 현재 작업 디렉토리를 절대 변경하지 마십시오.따라서 이 문제에 대해 걱정할 필요가 없으며, 사용할 수도 있습니다..
현재의 디렉토리를 나타내어, 애플리케이션내의 상대적인 파일 어드레싱을 문제없이 서포트할 수 있습니다.이 기능은 PowerShell의 새로운 버전(버전 2보다 새로운 버전)에서 작동합니다.
내 것은 짧아서 USB를 제외한 모든 것을 빼고 다시 컴파일해 주세요.
언급URL : https://stackoverflow.com/questions/8343767/how-to-get-the-current-directory-of-the-cmdlet-being-executed
'source' 카테고리의 다른 글
도커 이미지의 새 컨테이너에서 bash를 실행하려면 어떻게 해야 합니까? (0) | 2023.04.17 |
---|---|
데이터베이스에 대한 모든 연결을 끊는 스크립트(RESTRICTED_USER Rollback 이상) (0) | 2023.04.17 |
bash에서 바이너리로 파일을 표시하는 방법 (0) | 2023.04.17 |
UNIX의 셸 스크립트를 사용하여 10일 이상 지난 파일 삭제 (0) | 2023.04.17 |
데이터베이스 간에 데이터 전송 (0) | 2023.04.17 |