จะส่งอาร์กิวเมนต์ไปยังสคริปต์ PowerShell ได้อย่างไร


444

มีPowerShellสคริปต์ชื่อitunesForward.ps1ที่ทำให้ iTunes เดินหน้าอย่างรวดเร็ว 30 วินาที:

$iTunes = New-Object -ComObject iTunes.Application

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

มันจะถูกดำเนินการด้วยคำสั่งสายพร้อมท์:

powershell.exe itunesForward.ps1

เป็นไปได้ไหมที่จะส่งอาร์กิวเมนต์จากบรรทัดคำสั่งและใช้กับสคริปต์แทนค่าฮาร์ดโค้ด 30 วินาที

คำตอบ:


609

ผ่านการทดสอบการทำงาน:

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

$iTunes = New-Object -ComObject iTunes.Application

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

โทรมาด้วย

powershell.exe -file itunesForward.ps1 -step 15

7
เกิดอะไรขึ้นถ้าพารามิเตอร์เป็นสตริง ไวยากรณ์คืออะไร มันจะเป็นอย่างเช่น -step '15' หรือ -step "15"
Andrew Grey

7
@Andrew [string]แรกของทั้งหมดที่คุณต้องเปลี่ยนชนิดของพารามิเตอร์ในการ จากนั้นถ้าคุณต้องการที่จะผ่านสตริงเป็นพารามิเตอร์ที่คุณสามารถใช้อย่างใดอย่างหนึ่งหรือ' "หากไม่มีที่ว่าง (หรือเครื่องหมายคำพูด) ในสตริงคุณสามารถละเว้นเครื่องหมายคำพูดได้
Ocaso Protal

68
หากต้องการใช้หลายพารามิเตอร์ให้ใช้ไวยากรณ์นี้:param([string]$env,[string]$s3BucketName)
Josh Padnick

3
ไม่มี "-file" มันใช้งานไม่ได้สำหรับฉันจนกว่าฉันจะเพิ่มสิ่งนี้ ดูรหัสที่สมบูรณ์: powershell.exe -file itunesForward.ps1 -step 15
Charles

2
@ Charles ขอบคุณสำหรับคำใบ้ คุณพูดถูก: สาย-fileขาดหายไป การโทรที่ไม่มีอาจทำงานกับ Powershell เวอร์ชัน 1.0 แต่ฉันไม่สามารถทดสอบได้ อัปเดตคำตอบ
Ocaso Protal

363

คุณสามารถใช้$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

56
พบสิ่งนี้ง่ายกว่าโซลูชันที่ได้รับการยอมรับ PLUS คุณสามารถใช้ $ args [0] ได้ทุกที่ในสคริปต์ (ไม่จำเป็นต้องเป็นบรรทัดแรก) PS: เคล็ดลับในการผ่านสตริงเป็นอาร์กิวเมนต์: พวกเขาจะต้องอยู่ในเครื่องหมายคำพูดเดียว
ADTC

26
ทั้งวิธีนี้และวิธีการแก้ปัญหาที่ได้รับการยอมรับความแตกต่างที่สำคัญคือสิ่งนี้จะอ่านพารามิเตอร์ตามตำแหน่งในขณะที่วิธีการแก้ปัญหาที่ได้รับการยอมรับจะใช้ชื่อ เมื่อต้องผ่านพารามิเตอร์หลายตัวการส่งผ่านชื่ออาจจะสะอาดกว่า
Florin Dumitrescu

4
ชื่อ params ในโซลูชันที่ได้รับการยอมรับจะเติมความช่วยเหลือโดยอัตโนมัติ
Pete

3
คำตอบนี้ได้รับความสนใจมากโปรดตรวจสอบคำที่เกี่ยวข้องซึ่งสมบูรณ์กว่านี้มาก stackoverflow.com/questions/6359618/…
Emiliano Poggi

15

สคริปต์การโทรจากแบตช์ไฟล์ (* .bat) หรือ CMD

Powershell Core

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"

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

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

6

ให้ Powershell วิเคราะห์และตัดสินใจประเภทข้อมูล
ภายในใช้ 'Variant' สำหรับสิ่งนี้ ...
และโดยทั่วไปจะทำได้ดี ...

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
    }

3

สร้างสคริปต์ powershell ด้วยรหัสต่อไปนี้ในไฟล์

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

สิ่งนี้จะสร้างสคริปต์ด้วยพารามิเตอร์พา ธ มันจะแสดงรายการสัญลักษณ์ลิงก์ทั้งหมดภายในเส้นทางที่ให้ไว้รวมถึงเป้าหมายที่ระบุของลิงก์สัญลักษณ์


2

คุณยังสามารถกำหนดตัวแปรได้โดยตรงในบรรทัดคำสั่ง 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
}

2
#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 form 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
}

มันใช้งานได้แล้ว \ create-application-pool.ps1 -site xx_8010 -application AppTest -dirtestDir -applicationPool TestAppPool
Norberto Castellanos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.