prosource

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

probook 2023. 4. 8. 08:39
반응형

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

몇 년 동안, 나는 그 제품을 사용해 왔습니다.cmd/DOS/Windows셸 및 명령줄 인수를 배치파일에 전달합니다.예를 들어, 파일이 하나 있는데zuzu.bat그리고 그 안에서, 나는%1,%2, 등입니다.이때, 전화했을 때, 같은 조작을 실시합니다.PowerShell대본when I am in a Cmd.exe shell대본이 있는데xuxu.ps1(PS1을 PATHEXT 변수에 추가하고 PS1 파일을 PowerShell과 관련짓습니다).하지만 내가 뭘 하든, 난 아무것도 얻을 수 없을 것 같아.$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 문서를 검토한 후 이 문제에 대한 유용한 정보를 발견했습니다.를 사용할 수 없습니다.$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

네, 먼저 PowerShell의 기본적인 보안 기능을 해제하겠습니다.이러한 점을 이해하면 다음과 같은 작업을 수행할 수 있습니다.

  1. Windows 탐색기 창을 엽니다.
  2. 메뉴 도구 -> 폴더 옵션 -> 탭 파일 유형
  3. PS1 파일 유형을 찾아 [상세설정]버튼을 클릭합니다.
  4. [New] 버튼을 클릭합니다.
  5. 액션 풋: 오픈
  6. 응용 프로그램 입력: "C:\WINNT\system32\"Windows PowerShell\v1.0\powershell.exe" "-file" %1" %*

붙이는 것도 것 요.-NoProfile프로파일의 동작에 따라서도, 거기에 인수가 들어가 있습니다.

파라미터는 다음과 같이 파일에 선언할 수 있습니다.

[string]$param1
[string]$param2

. PowerShell 파일을 불러옵니다..\temp.ps1 param1 param2....param10 등등.

을 PowerShell 수 ..bat다음과 같이 합니다.

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

다음 이 のの の の の の の in in 에 넣었을 PATHPowerShell 。

ps foo 1 2 3

다만, 견적은 조금 혼란스러울 수 있습니다.

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

cmd에서 ps1 스크립트를 호출하고 스크립트를 호출하지 않고 인수를 전달하려면 다음과 같이 하십시오.

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

다음을 수행할 수 있습니다.

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

이는 powershell.exe가 경로에 있다고 가정합니다.

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

'xuxu p1 p2 p3 p4'가 표시되지 않을 수 있습니다.하지만 PowerShell을 사용하여

PS > Set-ExecutionPolicy Unrestricted -Scope CurrentUser

이러한 스크립트는 다음과 같이 실행할 수 있습니다.

./xuxu p1 p2 p3 p4

또는

.\xuxu p1 p2 p3 p4

또는

./xuxu.ps1 p1 p2 p3 p4

PowerShell에 조금 더 익숙해지시길 바랍니다.

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

반응형