2015-12-24 15 views
6

Sto provando disperatamente a passare i parametri da un file batch a uno script PowerShell che controlla se i servizi di Windows sono in esecuzione o meno.Passaggio dei parametri a PowerShell dal file bat

Qui è il mio comando pienamente operativa:

.\nsrservices.ps1 -cmd running nsrexecd,stisvc 

Ma il problema è il comportamento del comando:

  • In una finestra di PowerShell, i nomi dei servizi sono visti come due (o più) , verificando quindi 'nsrexecd', quindi cercando 'stisvc'
  • Nel file batch, i nomi dei servizi vengono passati a PowerShell come valore univoco, verificando quindi 'nsrexecd, stisvc'

Ecco il mio file bat:

powershell.exe -File .\nsrservices.ps1 -cmd running nsrexecd,stisvc 
ECHO.%ERRORLEVEL% 
exit /B %ERRORLEVEL% 

Nel mio file PS, i parametri vengono definiti così:

param([string]$cmd=$(throw "Type d'action manquante !"),[string[]]$srv) 

In un file di log, ho questi due risultati (spiacente per la produzione francese).

Dalla finestra PowerShell:

24/12/2015 09:02:50-Paramètres appelés : cmd=running srv=stisvc nsrexecd 
24/12/2015 09:02:50-Début test de l'état running du service : stisvc 
24/12/2015 09:02:50- Début évaluation de l'état du service : stisvc 
24/12/2015 09:02:50- Fin évaluation de l'état du service : stisvc 
24/12/2015 09:02:50-Le service tourne 
24/12/2015 09:02:50-Fin test de l'état running du service : stisvc 
24/12/2015 09:02:50-Début test de l'état running du service : nsrexecd 
24/12/2015 09:02:50- Début évaluation de l'état du service : nsrexecd 
24/12/2015 09:02:50- Fin évaluation de l'état du service : nsrexecd 
24/12/2015 09:02:50-Le service tourne 
24/12/2015 09:02:50-Fin test de l'état running du service : nsrexecd 

Il che significa che i servizi sono testati in sequenza

Dal file bat:

24/12/2015 09:04:24-Paramètres appelés : cmd=running srv=nsrexecd,stisvc 
24/12/2015 09:04:24-Début test de l'état running du service : nsrexecd,stisvc 
24/12/2015 09:04:24- Début évaluation de l'état du service : nsrexecd,stisvc 
24/12/2015 09:04:24-  Le service nsrexecd,stisvc n'existe pas ! 
24/12/2015 09:04:24- Fin évaluation de l'état du service : nsrexecd,stisvc 
24/12/2015 09:04:24-Fin test de l'état running du service : nsrexecd,stisvc 

Il che significa che il servizio denominato 'nsrexecd, stisvc ' non esiste.

La virgola tra le mie due nomi sembra creare confusione quando si utilizza un file .bat

così sto tirando i miei ultimi peli di trovare una soluzione per vincere contro questo file .bat sanguinosa.

Ho provato a virgolette, virgolette singole, -File, -Command, ma senza successo.

Qualsiasi suggerimento o soluzione sarebbe molto apprezzato poiché la mia ricerca su questo forum non mi ha dato qualcosa di utile.

E ovviamente, dopo vorrei chiamare il file .bat con i parametri.

+1

Una cosa che si potrebbe fare non è usare le virgole nella chiamata batch e cambiare il param per $ srv in 'ValueFromRemainingArguments = $ true'. Puoi vedere di più qui https://technet.microsoft.com/en-us/library/hh847743.aspx. Oppure basta inserirlo come una singola stringa e usare '-split", "' – Matt

+0

Perché chiamare uno script PowerShell da un file batch? Basta eseguirlo direttamente da PowerShell. –

+0

@Bill_Stewart: la mia domanda riguardava l'inclusione di PowerShell in un file .bat perché devo. Questo script è lanciato da un programma in esecuzione che non accetta altro da file .bat e .cmd ... –

risposta

2

Nel tuo caso userò:

[parameter(Mandatory=$true, 
      ValueFromRemainingArguments=$true)] 
[String[]] 
$services 

La chiamata lotto sarà simile a questa

powershell.exe -File .\nsrservices.ps1 -cmd running nsrexecd stisvc 

Per maggiori dettagli hanno uno sguardo al about_Functions_Advanced_Parameters

+0

Ottima soluzione; da quello che posso dire, questo è l'unico modo per passare direttamente una matrice di valori dall'esterno di PowerShell. Una cosa degna di nota: con questo approccio in realtà _ non devi_ usare il parametro _nome_ nell'invocazione ('-services', qui). – mklement0

-1

Infine, ho cambiato la mia strada. Poiché avevo nomi di servizio con spazi (e dovevo includere il mio .ps1 in a.file bat), ho deciso di mettere il controllo dei parametri nel main e di lasciare il

param([string]$cmd,[string[]]$srv) 

linea senza controlli.

Grazie a tutti.

-1

a invocare uno script PowerShell da un file BAT faccio normalmente

PowerShell .\script.ps1 -arg 1234 -arg2 5678 

o

PowerShell C:\path\to\script.ps1 -arg 1234 -arg2 5678 

Il file di script PowerShell dovrebbe avere qualcosa di simile

param([string]$arg, [string]$arg2) 

per lo inizio e inizio della sceneggiatura.

Nel mio parametro ([stringa] $ arg, [stringa] $ arg2), ho definito i nomi degli interruttori rispettivamente come arg e arg2. Quindi il file BAT assegnerà qualsiasi cosa dopo -arg a $ arg e qualsiasi cosa dopo -arg2 a $ arg2.

Possiamo cambiare questo per qualcosa di più conveniente a seconda del vostro script in modo, ad esempio nello script PowerShell si può cambiare a

param([string]$computer, [string]$filename) 

e nel nostro file BAT possiamo invocare PowerShell lo stesso come sopra, ma invece di -arg e -arg2, useremo -computer e -filename.

Tenete a mente che si tratta di ordine specifico, in modo da poter invocare lo script con gli argomenti come

PowerShell .\script.ps1 -computer MyComputer -filename MyFileName 

o

PowerShell .\script.ps1 -filename MyFileName -computer MyComputer 

-filename sarà sempre andare a $ filename

-computer andrà sempre a $ computer.

Spero che questo aiuti.

+0

L'OP sa già come richiamare uno script PS da un file batch _in generale_, come mostrato nella domanda. Il suo problema è specificamente con un parametro _array_, che la tua risposta non affronta. Inoltre, i nomi dei parametri sono _non_ case-sensitive in PowerShell. – mklement0