Làm cách nào để chuyển một đối số cho tập lệnh PowerShell?


444

Có một đoạn PowerShellscript được đặt tên itunesForward.ps1khiến iTunes nhanh chóng chuyển tiếp 30 giây:

$iTunes = New-Object -ComObject iTunes.Application

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

Nó được thực hiện với lệnh dòng nhắc:

powershell.exe itunesForward.ps1

Có thể truyền một đối số từ dòng lệnh và nó có được áp dụng trong tập lệnh thay vì giá trị 30 giây được mã hóa cứng không?

Câu trả lời:


609

Đã thử nghiệm như đang làm việc:

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
}

Gọi nó với

powershell.exe -file itunesForward.ps1 -step 15

7
Nếu tham số là một chuỗi thì sao? Cú pháp là gì? nó sẽ giống như -step '15' hoặc -step "15"
Andrew Gray

7
@Andrew Trước hết bạn phải thay đổi loại tham số thành [string]. Nếu sau đó bạn muốn truyền một chuỗi làm tham số, bạn có thể sử dụng 'hoặc ". Nếu không có khoảng trắng (hoặc dấu ngoặc kép) bên trong chuỗi, bạn thậm chí có thể bỏ qua dấu ngoặc kép.
Ocaso Protal

68
FYI, để sử dụng nhiều thông số, sử dụng cú pháp này:param([string]$env,[string]$s3BucketName)
Josh Padnick

3
Nó bị thiếu "-file". Nó không hoạt động cho tôi cho đến khi tôi thêm điều này. Xem mã hoàn chỉnh: powershell.exe -file itunesForward.ps1 -step 15
Charles

2
@Charles Cảm ơn các gợi ý. Bạn đã đúng: -fileMất tích từ cuộc gọi. Cuộc gọi mà không có thể hoạt động với Powershell Phiên bản 1.0 nhưng tôi không thể kiểm tra nó. Cập nhật câu trả lời.
Ocaso

363

Bạn cũng có thể sử dụng $argsbiến (giống như tham số vị trí):

$step=$args[0]

$iTunes = New-Object -ComObject iTunes.Application

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

sau đó có thể được gọi như:

powershell.exe -file itunersforward.ps1 15

56
Tìm thấy giải pháp này dễ dàng hơn giải pháp được chấp nhận, PLUS bạn có thể trực tiếp sử dụng $ args [0] ở bất kỳ đâu trong tập lệnh (không cần phải là dòng đầu tiên). PS: Mẹo về việc truyền chuỗi dưới dạng đối số: Chúng phải được đặt trong dấu ngoặc đơn.
ADTC

26
Cả giải pháp này và giải pháp được chấp nhận, sự khác biệt chính là điều này đọc các tham số theo vị trí, trong khi giải pháp được chấp nhận thực hiện theo tên. Khi cần truyền nhiều tham số, việc truyền theo tên có thể sạch hơn.
Florin Dumitrescu

4
tên params trong giải pháp được chấp nhận cũng tự động điền vào trợ giúp
Pete

3
Câu trả lời này đang nhận được rất nhiều sự chú ý, xin vui lòng kiểm tra câu liên quan đầy đủ hơn nhiều. stackoverflow.com/questions/6359618/ Hãy
Emiliano Poggi

15

Gọi Script từ tệp bó (* .bat) hoặc CMD

Lõi 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"

Quyền hạn

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"


Cuộc gọi từ powershell

Powershell Core hoặc Windows Powershell

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

Script.ps1 - Mã script

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

hãy để Powershell phân tích và quyết định kiểu dữ liệu
Trong nội bộ sử dụng 'Biến thể' cho việc này ...
và nói chung là làm rất tốt ...

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

hoặc nếu bạn cần truyền nhiều tham số

param( $x1, $x2 )
$iTunes = New-Object -ComObject iTunes.Application
if ( $iTunes.playerstate -eq 1 ) 
    { 
    $iTunes.PlayerPosition = $iTunes.PlayerPosition + $x1 
    $iTunes.<AnyProperty>  = $x2
    }

3

Tạo một tập lệnh powershell với đoạn mã sau trong tệp.

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

Điều này tạo ra một kịch bản với một tham số đường dẫn. Nó sẽ liệt kê tất cả các liên kết tượng trưng trong đường dẫn được cung cấp cũng như mục tiêu được chỉ định của liên kết tượng trưng.


2

Bạn cũng có thể xác định một biến trực tiếp trong dòng lệnh PowerShell và sau đó thực thi tập lệnh. Các biến sẽ được xác định ở đó, quá. Điều này đã giúp tôi trong trường hợp tôi không thể sửa đổi một tập lệnh đã ký.

Thí dụ:

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

với 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
}

Nó hoạt động. \ Tạo-application-pool.ps1 -site xx_8010 -application AppTest -dirtestDir -applicationPool TestAppPool
Norberto Castellanos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.