programing

PowerShell: 스크립트 디렉토리에서 명령 실행

powerit 2023. 4. 13. 21:13
반응형

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

예를 들어, 저는$profileVisual Studio 솔루션 파일을 찾아 시작하는 스크립트입니다.솔루션 파일이 시작되면 전체 경로를 저장하려고 했습니다.그러나 나는 원본 스크립트가 있는 파일을 저장하고 싶었다.그래서 저는$PsScriptRoot.

네이티브 앱에 전화하려면[Environment]::CurrentDirectoryPowerShell에 대해서가 아니라$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에서 자동으로 설정되지 않는 이유에 대한 두 가지 참고 사항:

  1. PowerShell은 멀티스레드 가능.단일 프로세스 내에서 여러 개의 Runspace(RunspacePool 및 PSThreadJob 모듈 참조)를 동시에 실행할 수 있습니다.각 런스페이스에는 독자적인 것이 있습니다.$PWD작업 디렉토리가 표시되지만 프로세스와 환경은 1개뿐입니다.
  2. 스레드일 지지 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

반응형