programing

PowerShell 스크립트에 인수를 전달하려면 어떻게 해야 합니까?

powerit 2023. 4. 8. 09:52
반응형

PowerShell 스크립트에 인수를 전달하려면 어떻게 해야 합니까?

PowerShell 스크립트에는itunesForward.ps1iTunes를 30초 빨리 감습니다.

$iTunes = New-Object -ComObject iTunes.Application

if ($iTunes.playerstate -eq 1)
{
  $iTunes.PlayerPosition = $iTunes.PlayerPosition + 30
}

이 명령어는 다음 프롬프트라인 명령어로 실행됩니다.

powershell.exe itunesForward.ps1

명령줄에서 인수를 전달하여 하드코드된 30초 값이 아닌 스크립트에 적용할 수 있습니까?

동작 테스트 완료:

#Must be the first statement in your script (not counting comments)
param([Int32]$step=30) 

$iTunes = New-Object -ComObject iTunes.Application

if ($iTunes.playerstate -eq 1)
{
  $iTunes.PlayerPosition = $iTunes.PlayerPosition + $step
}

로 전화하다

powershell.exe -file itunesForward.ps1 -step 15

여러 파라미터 구문(댓글은 임의이지만 허용됨):

<#
    Script description.

    Some notes.
#>
param (
    # height of largest column without top bar
    [int]$h = 4000,
    
    # name of the output image
    [string]$image = 'out.png'
)

또한 고급 파라미터의 몇 가지 예(: 필수:

<#
    Script description.

    Some notes.
#>
param (
    # height of largest column without top bar
    [Parameter(Mandatory=$true)]
    [int]$h,
    
    # name of the output image
    [string]$image = 'out.png'
)

Write-Host "$image $h"

기본값은 필수 파라미터와 함께 사용할 수 없습니다.를 생략할 수 있습니다.=$trueboolean 유형의 고급 매개 변수용[Parameter(Mandatory)].

를 사용할 수도 있습니다.$args변수(위치 파라미터와 동일):

$step = $args[0]

$iTunes = New-Object -ComObject iTunes.Application

if ($iTunes.playerstate -eq 1)
{
  $iTunes.PlayerPosition = $iTunes.PlayerPosition + $step
}

그 후, 다음과 같이 호출할 수 있습니다.

powershell.exe -file itunersforward.ps1 15

배치 파일(*.bat) 또는 CMD에서 스크립트를 호출합니다.

PowerShell 코어

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param1 Hello -Param2 World"

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "path-to-script/Script.ps1 -Param1 Hello -Param2 World"

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 Hello -Param2 World"

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 Hello World"

pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param2 World Hello"

PowerShell

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param1 Hello -Param2 World"

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "path-to-script/Script.ps1 -Param1 Hello -Param2 World"

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 Hello -Param2 World"

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 Hello World"

powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param2 World Hello"

PowerShell에서 호출

PowerShell Core 또는 Windows PowerShell

& path-to-script/Script.ps1 -Param1 Hello -Param2 World
& ./Script.ps1 -Param1 Hello -Param2 World

Script.ps1 - 스크립트코드

param(
    [Parameter(Mandatory=$True, Position=0, ValueFromPipeline=$false)]
    [System.String]
    $Param1,

    [Parameter(Mandatory=$True, Position=1, ValueFromPipeline=$false)]
    [System.String]
    $Param2
)

Write-Host $Param1
Write-Host $Param2

PowerShell에서 데이터 유형을 분석하고 결정하도록 합니다.이 경우 내부적으로 '변수'를 사용합니다.

그리고 일반적으로는 좋은 일을 해내죠

param($x)
$iTunes = New-Object -ComObject iTunes.Application
if ($iTunes.playerstate -eq 1)
{
    $iTunes.PlayerPosition = $iTunes.PlayerPosition + $x
}

또는 여러 매개 변수를 전달해야 하는 경우:

param($x1, $x2)
$iTunes = New-Object -ComObject iTunes.Application
if ($iTunes.playerstate -eq 1)
{
    $iTunes.PlayerPosition = $iTunes.PlayerPosition + $x1
    $iTunes.<AnyProperty>  = $x2
}
# ENTRY POINT MAIN()
Param(
    [Parameter(Mandatory=$True)]
    [String] $site,
    [Parameter(Mandatory=$True)]
    [String] $application,
    [Parameter(Mandatory=$True)]
    [String] $dir,
    [Parameter(Mandatory=$True)]
    [String] $applicationPool
)

# Create Web IIS Application
function ValidateWebSite ([String] $webSiteName)
{
    $iisWebSite = Get-Website -Name $webSiteName
    if($Null -eq $iisWebSite)
    {
        Write-Error -Message "Error: Web Site Name: $($webSiteName) not exists."  -Category ObjectNotFound
    }
    else
    {
        return 1
    }
}

# Get full path from IIS WebSite
function GetWebSiteDir ([String] $webSiteName)
{
    $iisWebSite = Get-Website -Name $webSiteName
    if($Null -eq $iisWebSite)
    {
        Write-Error -Message "Error: Web Site Name: $($webSiteName) not exists."  -Category ObjectNotFound
    }
    else
    {
        return $iisWebSite.PhysicalPath
    }
}

# Create Directory
function CreateDirectory([string]$fullPath)
{
    $existEvaluation = Test-Path $fullPath -PathType Any
    if($existEvaluation -eq $false)
    {
        new-item $fullPath -itemtype directory
    }
    return 1
}

function CreateApplicationWeb
{
    Param(
        [String] $WebSite,
        [String] $WebSitePath,
        [String] $application,
        [String] $applicationPath,
        [String] $applicationPool
        )
    $fullDir = "$($WebSitePath)\$($applicationPath)"
    CreateDirectory($fullDir)
    New-WebApplication -Site $WebSite -Name $application -PhysicalPath $fullDir -ApplicationPool $applicationPool -Force
}

$fullWebSiteDir = GetWebSiteDir($Site)f($null -ne $fullWebSiteDir)
{
    CreateApplicationWeb -WebSite $Site -WebSitePath $fullWebSiteDir -application $application  -applicationPath $dir -applicationPool $applicationPool
}

파일에 다음 코드를 사용하여 PowerShell 스크립트를 생성합니다.

param([string]$path)
Get-ChildItem $path | Where-Object {$_.LinkType -eq 'SymbolicLink'} | select name, target

그러면 경로 매개 변수를 사용하여 스크립트가 생성됩니다.제공된 경로 내의 모든 심볼릭링크와 심볼릭링크의 지정된 타깃이 나열됩니다.

PowerShell 명령줄에서 직접 변수를 정의한 다음 스크립트를 실행할 수도 있습니다.변수도 거기서 정의됩니다.이것은 서명된 스크립트를 수정할 수 없는 경우에 도움이 되었습니다.

예:

 PS C:\temp> $stepsize = 30
 PS C:\temp> .\itunesForward.ps1

iTunesForward.ps1을 사용하는 경우

$iTunes = New-Object -ComObject iTunes.Application

if ($iTunes.playerstate -eq 1)
{
  $iTunes.PlayerPosition = $iTunes.PlayerPosition + $stepsize
}

특히 사용 예에서는 프로파일의 인수에 액세스하여params인수(기본적으로 스위치)가 존재하는지 여부를 확인합니다.

ps1 파일을 실행하지만 프로파일이 있는 배치 스크립트를 가지고 있습니다.그거profile.ps1로딩 시 텍스트를 출력합니다.일부 스크립트에서는 필요 없는 경우 해당 텍스트의 출력을 비활성화할 수 있습니다.그 때문에, 이하의 예와 같은 간단한 스위치를 작성했습니다.

이것은 매우 기본적인 버전이지만, 원한다면 연장할 수 있습니다.'silent-running' 모드를 예로 들어 보겠습니다.

배치 스크립트 내부:

C:\path\to\pwsh.exe -Command "%~dpn0.ps1" -QuietProfile

스크립트(PowerShell )profile.ps1

[Boolean]$global:QuietProfile = [Boolean]([Environment]::GetCommandLineArgs() -match "-QuietProfile")

if (-not $global:QuietProfile) {
  Write-Host "I am some text which should not appear when -QuietProfile is passed"
}

를 연 지 안 된 ) " " " ( pwsh.exe " " )$global:QuietProfile거짓

언급URL : https://stackoverflow.com/questions/5592531/how-can-i-pass-an-argument-to-a-powershell-script

반응형