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"
편집 (OP의 의견을 기반으로 함) :
# temporarily change to the correct folder
Push-Location $folder
# 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
예를 들어 Visual Studio 솔루션 파일을 찾아 시작하는 $ profile 스크립트가 있습니다. 솔루션 파일이 시작되면 전체 경로를 저장하고 싶었습니다. 그러나 원본 스크립트가 존재하는 곳에 파일을 저장하고 싶었습니다. 그래서 $ 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
이것에 대한 완벽한 대안은 없습니다. 우리 중 많은 사람들이 [Environment] :: CurrentDirectory ...를 설정하기 위해 프롬프트 기능에 줄을 넣었지만 스크립트 내 에서 위치를 변경할 때 도움이되지 않습니다 .
이것이 PowerShell에 의해 자동으로 설정되지 않는 이유에 대한 두 가지 참고 사항 :
- PowerShell은 다중 스레드 일 수 있습니다. 단일 프로세스 내에서 여러 Runspace (RunspacePool 및 PSThreadJob 모듈 참조)를 동시에 실행할 수 있습니다. 각 실행 영역에는 고유 한
$PWD
현재 작업 디렉토리가 있지만 하나의 프로세스와 하나의 환경 만 있습니다. - 단일 스레드 인
$PWD
경우에도 항상 유효한 CurrentDirectory는 아닙니다 (예를 들어 레지스트리 공급자에 CD를 넣을 수 있음).
프롬프트에 넣으려면 (단일 스레드의 주 실행 영역에서만 실행) 다음을 사용해야합니다.
[Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem
필자는 종종 다음 코드를 사용하여 실행중인 스크립트와 동일한 디렉토리에있는 모듈을 가져 왔습니다. 먼저 powershell이 실행되는 디렉토리를 가져옵니다.
$ currentPath = 분할 경로 ((Get-Variable MyInvocation -Scope 0) .Value) .MyCommand.Path
import-module "$currentPath\sqlps.ps1"
This would work fine.
Push-Location $PSScriptRoot
Write-Host CurrentDirectory $CurDir
Well I was looking for solution for this for a while, without any scripts just from CLI. This is how I do it xD:
Navigate to folder from which you want to run script (important thing is that you have tab completions)
..\..\dir
Now surround location with double quotes, and inside them add
cd
, so we could invoke another instance of powershell."cd ..\..\dir"
Add another command to run script separated by
;
, with is a command separator in powershell"cd ..\..\dir\; script.ps1"
Finally Run it with another instance of powershell
start powershell "cd..\..\dir\; script.ps1"
This will open new powershell window, go to ..\..\dir
, run script.ps1
and close window.
Note that ";" just separates commands, like you typed them one by one, if first fails second will run and next after, and next after... If you wanna keep new powershell window open you add -noexit in passed command . Note that I first navigate to desired folder so I could use tab completions (you couldn't in double quotes).
start powershell "-noexit cd..\..\dir\; script.ps1"
Use double quotes ""
so you could pass directories with spaces in names e.g.,
start powershell "-noexit cd '..\..\my dir'; script.ps1"
참고URL : https://stackoverflow.com/questions/4724290/powershell-run-command-from-scripts-directory
'development' 카테고리의 다른 글
jQuery Data () API를 사용하여 데이터 속성을 설정할 수 없습니다 (0) | 2020.06.30 |
---|---|
95 %의 경우에 값이 0 또는 1 일 때 매우 큰 배열에 대한 임의 액세스 최적화? (0) | 2020.06.29 |
동일한 시스템 내에서 다른 프로젝트에 대해 여러 사용자 이름을 git [duplicate] (0) | 2020.06.29 |
Django로 '대량 업데이트'하는 방법은 무엇입니까? (0) | 2020.06.29 |
실행중인 git 버전을 어떻게 알 수 있습니까? (0) | 2020.06.29 |