2013-05-07 18 views
41

Sono nuovo in PowerShell e sto cercando di insegnarmi le basi. Ho bisogno di scrivere uno script ps per analizzare un file, che non è stato troppo difficile.Passaggio di una variabile a uno script di PowerShell tramite riga di comando

Ora voglio cambiarlo per passare una variabile allo script. quella variabile sarà la stringa di analisi. Ora, la variabile sarà sempre 1 parola e non un insieme di parole o più parole.

Questo sembra troppo semplice, ma rappresenta un problema per me. Ecco il mio codice semplice:

$a = Read-Host 
Write-Host $a 

Quando eseguo lo script dalla mia linea di comando il passare variabile non funziona:

.\test.ps1 hello 
.\test.ps1 "hello" 
.\test.ps1 -a "hello" 
.\test.ps1 -a hello 
.\test.ps1 -File "hello" 

Come potete vedere, ho provato molte methos senza successo , della sceneggiatura assumendo il valore di un output.

Lo script viene eseguito e attende che io digiti un valore e, quando lo faccio, emette tale valore.

Voglio solo che produca il mio valore passato, quale minuscola cosa mi manca?

Grazie.

+1

Eventuali duplicati di [Come gestire gli argomenti della riga di comando in PowerShell] (http://stackoverflow.com/questions/2157554/how-to-handle-command-line-arguments-in-powershell) –

risposta

38

Ecco un buon tutorial su Powershell params:

PowerShell ABC's - P is for Parameters

In sostanza, è necessario utilizzare una dichiarazione param sulla prima linea dello script

param([type]$p1 = , [type]$p2 = , ...)

o utilizzare i $ args variabile incorporata, che è automaticamente popolato con tutti i args .

+1

il link è rotto –

+0

@ Michaelhedgpeth: Sembra che sia stato un problema temporaneo; è tornato adesso. Non conosco un collegamento più permanente per l'articolo. –

+1

hai ragione, grazie per il follow-up –

54

Fai questo nel tuo test.ps1, in prima linea

param(
[string]$a 
) 

Write-Host $a 

Poi si può chiamare con

./Test.ps1 "Here is your text" 

Trovato here

+0

Id piuttosto chiamalo con ./Test.ps1 -a = "Ecco il tuo testo" ma la sua stampa $ è come questa: -a = Ecco la tua stringa – ozzy432836

+0

@ ozzy432836 Anch'io preferisco quella sintassi, ma non è incorporata PowerShell. Senza spazio PS lo vede come un singolo argomento senza nome. Puoi certamente implementare il tuo argomento di parsing, ma potresti considerare che non sarà quello che si aspettano gli altri.La funzionalità integrata di Powershell consente argomenti denominati e senza nome (anche posizionali), argomenti obbligatori e facoltativi con valori predefiniti e genera automaticamente aiuto. Questo è molto da buttare via perché tu (e io) preferisci un '=' a uno spazio. Ho perso tempo a reinventare questa ruota in C# Pochi dei miei utenti potrebbero averne a cuore. –

5

Dichiarare il parametro nel test.ps1:

Param(
       [Parameter(Mandatory=$True,Position=1)] 
       [string]$input_dir, 
       [Parameter(Mandatory=$True)] 
       [string]$output_dir, 
       [switch]$force = $false 
       ) 

Eseguire lo script da eseguire o di pianificazione di Windows:

powershell.exe -command "& C:\FTP_DATA\test.ps1 -input_dir C:\FTP_DATA\IN -output_dir C:\FTP_DATA\OUT" 

o,

powershell.exe -command "& 'C:\FTP DATA\test.ps1' -input_dir 'C:\FTP DATA\IN' -output_dir 'C:\FTP DATA\OUT'" 
Problemi correlati