developer tip

PowerShell PS1 파일에 명령 줄 인수를 전달하는 방법

copycodes 2020. 10. 8. 08:09
반응형

PowerShell PS1 파일에 명령 줄 인수를 전달하는 방법


수년 동안 저는 cmd/DOS/Windows을 사용하고 명령 줄 인수를 배치 파일에 전달했습니다. 예를 들어, 내가 파일을 가지고 zuzu.bat있으며, 나는 액세스 %1, %2등 지금, 나는 내가 호출 할 때 동일한 작업을 수행 할 PowerShell스크립트를 when I am in a Cmd.exe shell. 스크립트가 있습니다 xuxu.ps1(그리고 PS1을 PATHEXT 변수에 추가하고 PowerShell과 관련된 PS1 파일을 추가했습니다). 그러나 내가 무엇을하든 $args변수 에서 아무것도 얻을 수없는 것 같습니다 . 항상 길이가 0입니다.

내가 PowerShell대신 쉘 에 있다면 cmd.exe(물론) 작동합니다. 그러나 저는 아직 PowerShell 환경에서 풀 타임으로 살기에 충분히 편안하지 않습니다. 를 입력하고 싶지 않습니다 powershell.exe -command xuxu.ps1 p1 p2 p3 p4. 를 입력하고 싶습니다 xuxu p1 p2 p3 p4.

이것이 가능하고 가능하다면 어떻게합니까?

작업 할 수없는 샘플은 foo.ps1입니다.

Write-Host "Num Args:" $args.Length;
foreach ($arg in $args) {
    Write-Host "Arg: $arg";
}

결과는 항상 다음과 같습니다.

C:\temp> foo
Num Args: 0
C:\temp> foo a b c d
Num Args: 0
c:\temp>

이 기사가 도움 됩니다. 특히이 섹션 :

-파일

로컬 범위 ( "점 소스")에서 지정된 스크립트를 실행하여 스크립트가 만드는 함수와 변수를 현재 세션에서 사용할 수 있도록합니다. 스크립트 파일 경로와 매개 변수를 입력합니다. File 매개 변수 이름 뒤에 입력 된 모든 문자는 스크립트 파일 경로 뒤에 스크립트 매개 변수가 오는 것으로 해석되므로 File은 명령의 마지막 매개 변수 여야합니다.

powershell.exe -File "C:\myfile.ps1" arg1 arg2 arg3

myfile.ps1 파일을 실행하고 arg1 arg2 및 arg3은 PowerShell 스크립트의 매개 변수입니다.


좋습니다. 먼저 이것은 PowerShell의 기본 보안 기능을 깨는 것입니다. 이를 이해하면 다음과 같이 할 수 있습니다.

  1. Windows 탐색기 창을 엽니 다.
  2. 메뉴 도구 -> 폴더 옵션 -> 탭 파일 유형
  3. PS1 파일 유형을 찾아 고급 버튼을 클릭하십시오.
  4. 새로 만들기 버튼을 클릭하십시오.
  5. 액션 넣어 : 열기
  6. 응용 프로그램 넣어 : "C : \ WINNT \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-file" "% 1"% *

-NoProfile프로필이 무엇을하는지에 따라 거기에 논쟁 을 할 수도 있습니다 .


PowerShell 설명서를 살펴본 후이 문제에 대한 유용한 정보를 발견했습니다. 파일 시작 부분에 $args를 사용한 경우를 사용할 수 없습니다 param(...). 대신 $PSBoundParameters. 코드를 PowerShell 스크립트에 복사 / 붙여 넣기했는데 PowerShell 버전 2에서 예상했던대로 작동했습니다 (이 문제가 발생했을 때 사용중인 버전이 확실하지 않습니다).

사용중인 경우 $PSBoundParameters( param(...)스크립트 시작 부분에서 사용하는 경우에만 작동 함 ), 배열이 아니라 해시 테이블이므로 키 / 값 쌍을 사용하여 참조해야합니다.

param($p1, $p2, $p3, $p4)
$Script:args=""
write-host "Num Args: " $PSBoundParameters.Keys.Count
foreach ($key in $PSBoundParameters.keys) {
    $Script:args+= "`$$key=" + $PSBoundParameters["$key"] + "  "
}
write-host $Script:args

그리고 전화를 걸면 ...

PS> ./foo.ps1 a b c d

결과는 ...

Num Args:  4
$p1=a  $p2=b  $p3=c  $p4=d

param과 같이 파일에서 매개 변수를 선언 할 수 있습니다.

[string]$para1
[string]$param2

그런 다음 PowerShell 파일을 이렇게 호출하십시오 .\temp.ps1 para1 para2....para10.


Maybe you can wrap the PowerShell invocation in a .bat file like so:

rem ps.bat
@echo off
powershell.exe -command "%*"

If you then placed this file under a folder in your PATH, you could call PowerShell scripts like this:

ps foo 1 2 3

Quoting can get a little messy, though:

ps write-host """hello from cmd!""" -foregroundcolor green

You may not get "xuxu p1 p2 p3 p4" as it seems. But when you are in PowerShell and you set

PS > set-executionpolicy Unrestricted -scope currentuser

You can run those scripts like this:

./xuxu p1 p2 p3 p4

or

.\xuxu p1 p2 p3 p4

or

./xuxu.ps1 p1 p2 p3 p4

I hope that makes you a bit more comfortable with PowerShell.


if you want to invoke ps1 scripts from cmd and pass arguments without invoking the script like

powershell.exe script.ps1 -c test
script -c test ( wont work )

you can do the following

setx PATHEXT "%PATHEXT%;.PS1" /m
assoc .ps1=Microsoft.PowerShellScript.1
ftype Microsoft.PowerShellScript.1=powershell.exe "%1" %*

This is assuming powershell.exe is in your path

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ftype

참고URL : https://stackoverflow.com/questions/1293907/how-to-pass-command-line-arguments-to-a-powershell-ps1-file

반응형