2014-04-16 15 views
5

Primo post quindi per favore non farmi del male. Ho cercato in giro ma non riesco a trovare il modo di fare ciò che voglio. Ho creato uno script che copia una cartella che ho in numerosi computer su \ $ computer \ c $. In queste cartelle è un file batch che esegue un exe. Quello che voglio fare è avere Powershell pull dallo stesso computer.txt che ho usato per copiare la cartella e quindi usare psexec per eseguire il file batch. Potrei fare tutto questo manualmente ma lo script sembra essere un problema, ecco cosa pensavo avrebbe funzionato ma apparentemente no.Usa Powershell per eseguire il comando Psexec

$computers = gc "C:\scripts\computers.txt" 

foreach ($computer in $computers) { 
if (test-Connection -Cn $computer -quiet) { 
    cd C:\pstools 
    psexec \\%computer cmd 
    C:\Folder\install.bat" 
} else { 
    "$computer is not online" 
} 

}

+0

È che lo script vero copiato e incollato? O semplicemente ri-digitato, forse con alcuni refusi? – TheMadTechnician

+0

L'ho copiato/incollato. Sono molto novizio con lo scripting in Powershell, mi dispiace se la sintassi è misera. – noz3r0

+0

prova a non usare psexec con powershell, ho molti problemi su questo ... –

risposta

8

Ok, prendiamolo dall'alto poi.

$computers = gc "C:\scripts\computers.txt" 

che carica il contenuto del file "computers.txt" nella variabile $computers. Abbastanza semplice, nessun problema lì.

Quindi abbiamo un ciclo ForEach. Divide il contenuto di $computers ed elabora ogni riga (presumibilmente il nome di un computer) come $computer rispetto a tutto il codice all'interno delle parentesi graffe.

foreach ($computer in $computers) { 

Questo ciclo si avvia con un'istruzione If-Then standard. Se (condition) quindi {do stuff}. In questo caso sta verificando se lo $computer è disponibile sulla rete. Se lo è, tenta di eseguire PSExec su di esso. Se non è online, esegue la clausola di Else, ci arriveremo in un secondo.

if (test-Connection -Cn $computer -quiet) { 

Quindi cambia directory. Un po 'inutile, ma ok, qualunque cosa. Potresti averlo chiamato in modo esplicito, come C:\PSTools\PSExec.exe <arguments> e salvato una riga, ma non c'è davvero nulla di male.

cd C:\pstools 

Quindi si chiama PSExec, anche se qui c'è un piccolo errore di sintassi. Dovrebbe essere $computer e non %computer. Inoltre, dovrebbe avere solo il comando che si desidera eseguire, non cmd e il comando su una seconda riga. Potresti avere risultati migliori se usi l'operatore Chiama (&) per far sì che PowerShell realizzi che sta tentando di eseguire qualcosa e non esegue un cmdlet o una funzione o cosa no.

& psexec \\$computer C:\Folder\install.bat 

Dopo di che è la clausola Else che dice che se il computer non è in linea di scrivere la stringa "$ computer non è in linea" seguita da chiusura parentesi graffe per la clausola Else e del ciclo foreach.

} else { 
    "$computer is not online" 
} 


} 

Edit: Ok, lo script finito dovrebbe apparire qualcosa di simile (target racchiuso tra virgolette nel caso in cui non ci sono spazi nel percorso):

$computers = gc "C:\scripts\computers.txt" 

foreach ($computer in $computers) { 
    if (test-Connection -Cn $computer -quiet) { 
     & C:\pstools\psexec.exe \\$computer "C:\folder\install.bat" 
    } else { 
     "$computer is not online" 
    } 
} 
+0

Ok, vedo come potrei ridurlo un po '. Grazie per l'intera rottura. Il mio problema ora è che non riesco a far funzionare correttamente la funzione Psexec e non sono sicuro di cosa sto facendo male. Se lo facessi manualmente aprirò un prompt dei comandi e scriverò 'psexec \\ hostname cmd', quindi mi troverei nel prompt dei comandi di quella macchina, da cui potrei semplicemente navigare nella cartella che voglio ed eseguire il file batch . – noz3r0

+0

Sei sicuro che stia fallendo? PSExec genererà un errore se lo si esegue in PowerShell ISE e continua a funzionare. C'è una ragione per questo, e ha a che fare con il modo in cui PSExec emette i dati, e alcuni di essi vengono inviati al flusso di output standard, e alcuni di essi vengono inviati al flusso di errori. Indipendentemente da ciò, sei sicuro che non funzioni? – TheMadTechnician

+0

Vedo che hai gettato una modifica lassù, la mia sceneggiatura finale non era come quella che avevi, ti darò un passaggio la mattina e ti faccio sapere. Sembra che dovrebbe funzionare comunque. Grazie per la vostra diligenza. – noz3r0

1

dare una prova. Hai avuto un % dove volevi uno $. Anche la chiamata cmd.exe non è necessaria.

$computers = gc "C:\scripts\computers.txt" 

foreach ($computer in $computers) { 
if (test-Connection -Cn $computer -quiet) { 
    cd C:\pstools 
    psexec \\$computer "C:\Folder\install.bat" 
} else { 
    "$computer is not online" 
} 

} 
+0

Falso allarme. Non eseguirà psexec in questo modo, dice che non è un cmdlet valido. Esiste un comando per eseguire gli eseguibili? – noz3r0

0

uso & (call) dell'operatore, & psexec \ $ computer "C: \ Folder \ install.bat "

4

Mi rendo conto che questa domanda è del 2014, e questa risposta non affronterà direttamente la domanda che l'utente ha chiesto, ma per le persone che si imbattono in questa domanda in questi giorni, voglio buttar fuori che non lo fai * bisogno di usare PSExec se si sta utilizzando PowerShell. Visto che siete già in PowerShell, basta usare Invoke-Command.

sintassi sarebbe

Invoke-Command -ComputerName $Computer -ScriptBlock { C:\Folder\install.bat } 

E 'davvero così facile.

* Richiede il servizio remoto di PowerShell abilitato sul server di destinazione.

+1

Questa è una grossolana semplificazione eccessiva. Se install.bat ha bisogno di un doppio salto, questo non funzionerà. –