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의 기본 보안 기능을 깨는 것입니다. 이를 이해하면 다음과 같이 할 수 있습니다.
- Windows 탐색기 창을 엽니 다.
- 메뉴 도구 -> 폴더 옵션 -> 탭 파일 유형
- PS1 파일 유형을 찾아 고급 버튼을 클릭하십시오.
- 새로 만들기 버튼을 클릭하십시오.
- 액션 넣어 : 열기
- 응용 프로그램 넣어 : "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
'developer tip' 카테고리의 다른 글
부트 스트랩 열 높이를 100 % 행 높이로 만드는 방법은 무엇입니까? (0) | 2020.10.08 |
---|---|
C 프로그래밍 : 유니 코드 용으로 프로그래밍하는 방법? (0) | 2020.10.08 |
강제 푸시없이 어떻게 git rebase를 사용할 수 있습니까? (0) | 2020.10.08 |
SQLite 데이터베이스 모드를 읽기-쓰기로 변경 (0) | 2020.10.08 |
Webpack-dev-server는 앱 페이지 대신 디렉토리 목록을 제공합니다. (0) | 2020.10.08 |