PowerShell: 스크립트 디렉토리에서 명령 실행
PowerShell 스크립트는 스크립트의 현재 디렉토리를 사용하여 몇 가지 작업을 수행합니다.이 디렉토리 내에서 실행 중.\script.ps1
올바르게 동작합니다.
여기서 스크립트의 참조 디렉토리를 변경하지 않고 다른 디렉토리에서 스크립트를 호출합니다.그래서 전화하고 싶다...\..\dir\script.ps1
또, 그 스크립트가 디렉토리내에서 호출된 대로 동작하도록 해 주세요.
어떤 디렉토리에서도 실행할 수 있도록 스크립트를 수정하려면 어떻게 해야 합니까?
스크립트 옆에 있는 파일을 참조할 수 있도록 스크립트 고유의 경로를 원하십니까?이것을 시험해 보세요.
$scriptpath = $MyInvocation.MyCommand.Path
$dir = Split-Path $scriptpath
Write-host "My directory is $dir"
$MyInvocation 및 속성에서 많은 정보를 얻을 수 있습니다.
현재 작업 디렉토리의 파일을 참조하려면 Resolve-Path 또는 Get-ChildItem을 사용할 수 있습니다.
$filepath = Resolve-Path "somefile.txt"
EDIT(OP 코멘트 기준):
# temporarily change to the correct folder
Push-Location $dir
# do stuff, call ant, etc
# now back to previous directory
Pop-Location
Invoke-Command를 사용하여 유사한 작업을 수행하는 다른 방법도 있을 것입니다.
투표수가 많은 답변도 있지만 질문을 읽어보니 스크립트가 실행되고 있는 디렉토리가 아니라 스크립트가 있는 디렉토리를 알고 싶어하시는 것 같아서요.powershell의 자동변수로 정보를 얻을 수 있습니다.
$PSScriptRoot # the directory where the script exists, not the
# target directory the script is running in
$PSCommandPath # the full path of the script
예를 들어, 저는$profile
Visual Studio 솔루션 파일을 찾아 시작하는 스크립트입니다.솔루션 파일이 시작되면 전체 경로를 저장하려고 했습니다.그러나 나는 원본 스크립트가 있는 파일을 저장하고 싶었다.그래서 저는$PsScriptRoot
.
네이티브 앱에 전화하려면[Environment]::CurrentDirectory
PowerShell에 대해서가 아니라$PWD
현재 디렉토리여러 가지 이유로 PowerShell은 사용자가 Set-Location 또는 Push-Location을 실행할 때 프로세스의 현재 작업 디렉토리를 설정하지 않으므로 설정될 것으로 예상되는 응용 프로그램(또는 cmdlet)을 실행하는 경우 설정해야 합니다.
스크립트에서는, 다음과 같이 할 수 있습니다.
$CWD = [Environment]::CurrentDirectory
Push-Location $MyInvocation.MyCommand.Path
[Environment]::CurrentDirectory = $PWD
## Your script code calling a native executable
Pop-Location
# Consider whether you really want to set it back:
# What if another runspace has set it in-between calls?
[Environment]::CurrentDirectory = $CWD
이것에 대한 확실한 대안은 없다.많은 사람들이 프롬프트 기능에 [환경]을 설정하기 위해 줄을 긋습니다.: Current Directory ... 단, 스크립트 내에서 위치를 변경할 때는 도움이 되지 않습니다.
PowerShell에서 자동으로 설정되지 않는 이유에 대한 두 가지 참고 사항:
- PowerShell은 멀티스레드 가능.단일 프로세스 내에서 여러 개의 Runspace(RunspacePool 및 PSThreadJob 모듈 참조)를 동시에 실행할 수 있습니다.각 런스페이스에는 독자적인 것이 있습니다.
$PWD
작업 디렉토리가 표시되지만 프로세스와 환경은 1개뿐입니다. - 스레드일 지지 even even even even even even even even even even even even even
$PWD
가 항상 합법적인 Current Directory는 아닙니다(예를 들어 레지스트리 공급자에 CD를 삽입할 수 있습니다).
프롬프트(단일 스레드 주 런스페이스에서만 실행됨)에 삽입하려면 다음을 사용해야 합니다.
[Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem
이거면 될 것 같아.
Push-Location $PSScriptRoot
Write-Host CurrentDirectory $CurDir
실행 중인 스크립트와 동일한 디렉토리에 있는 모듈을 Import할 때 종종 다음 코드를 사용했습니다.먼저 powershell이 실행되고 있는 디렉토리를 가져옵니다.
$currentPath=MyInvocation-Path(Get-Variable MyInvocation -Scope 0).가치). MyCommand.경로.
import-module "$currentPath\sqlps.ps1"
저는 @JohnL의 솔루션으로 원라이너를 만들었습니다.
$MyInvocation.MyCommand.Path | Split-Path | Push-Location
한동안 CLI에서만 스크립트를 사용하지 않고 이 솔루션을 찾고 있었습니다.방법은 다음과 같습니다.xD:
스크립트를 실행할 폴더로 이동합니다(중요한 것은 탭 완성이 있어야 합니다).
..\..\dir
큰따옴표로 그 에 '따옴표'를 붙입니다.
cd
파워셸"cd ..\..\dir"
를 추가하여 합니다.
;
"cd ..\..\dir\; script.ps1"
마지막으로 다른 powershell 인스턴스로 실행
start powershell "cd..\..\dir\; script.ps1"
창이 powershell로 합니다...\..\dir
, run , runfilename.script.ps1
을을닫닫닫닫다다
";"는 입력하신 명령어를 1개씩 구분하기만 하면 됩니다.첫 번째 실패 시 두 번째 실패 후 다음 실패 후 다음 실패가 실행됩니다.새 powershell 창을 열어두려면 passed 명령어에 -noexit을 추가합니다. 먼저 원하는 폴더로 이동하여 탭 완료를 사용합니다(큰따옴표로 묶을 수 없습니다).
start powershell "-noexit cd..\..\dir\; script.ps1"
""
에 공백이 있는 할 수
start powershell "-noexit cd '..\..\my dir'; script.ps1"
언급URL : https://stackoverflow.com/questions/4724290/powershell-run-command-from-scripts-directory
'programing' 카테고리의 다른 글
Excel 번호 형식:"-409"가 뭐죠? (0) | 2023.04.13 |
---|---|
WPF 치트시트가 있나요? (0) | 2023.04.13 |
groovy array/hash/collection/list의 요소 확인 방법 (0) | 2023.04.13 |
WPF XAML : DataGrid에서 다중 선택을 해제하려면 어떻게 해야 합니까? (0) | 2023.04.13 |
큰 텍스트 파일을 같은 줄의 작은 파일로 분할하려면 어떻게 해야 합니까? (0) | 2023.04.13 |