web-dev-qa-db-fra.com

Utilisez Powershell pour exécuter la commande Psexec

Premier post alors s'il vous plaît ne me faites pas mal. J'ai cherché autour mais je n'arrive pas à trouver un moyen de faire ce que je veux. J'ai créé un script qui copie un dossier que j'ai sur de nombreux ordinateurs à l'adresse\$ computer\c $. Dans ces dossiers se trouve un fichier de commandes qui exécute un fichier .exe. Ce que je veux faire, c’est que Powershell tire le même fichier computers.txt que j’avais utilisé pour copier le dossier, puis j’utilisais psexec pour exécuter le fichier de traitement par lots. Je pouvais tout faire manuellement, mais le script semble être un problème, voici ce que je pensais qui fonctionnerait, mais apparemment pas.

    $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"
}

}

7
noz3r0

Ok, prenons-le du haut alors.

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

Cela charge le contenu du fichier "computers.txt" dans la variable $computers. Assez simple, pas de problèmes là-bas.

Ensuite, nous avons une boucle ForEach. Il divise le contenu de $computers et traite chaque ligne (probablement le nom d'un ordinateur) en tant que $computer contre tout le code entre les accolades.

foreach ($computer in $computers) {

Cette boucle démarre avec une instruction If-Then standard. Si (condition) puis {do stuff}. Dans ce cas, il teste pour voir si le $computer est disponible sur le réseau. Si tel est le cas, il essaiera d’exécuter PSExec dessus. S'il n'est pas en ligne, il exécute la clause Else, nous y reviendrons dans un instant.

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

Puis cela change de répertoire. Un peu inutile, mais ok, peu importe. Vous auriez pu simplement l'appeler explicitement, tel que C:\PSTools\PSExec.exe <arguments> et enregistrer une ligne, mais il n'y a vraiment aucun mal à faire.

cd C:\pstools

Ensuite, vous appelez PSExec, bien qu’il y ait une petite erreur de syntaxe ici. Ce devrait être $computer et non pas %computer. En outre, il devrait contenir uniquement la commande que vous voulez exécuter, pas cmd et la commande sur une deuxième ligne. Vous obtiendrez peut-être de meilleurs résultats si vous utilisez l'opérateur Appel (&) pour faire en sorte que PowerShell réalise qu'il tente d'exécuter quelque chose sans exécuter une applet de commande, une fonction ou autre.

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

Ensuite, la clause Else indique si l'ordinateur n'est pas en ligne pour écrire la chaîne "$ computer is not online" suivie par des accolades fermantes pour la clause Else et la boucle ForEach.

} else {
    "$computer is not online"
}


}

Edit: Ok, votre script final devrait ressembler à ceci (cible entre guillemets au cas où il y aurait des espaces dans le chemin):

$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"
    }
}
11
TheMadTechnician

Je me rends compte que cette question date de 2014 et cette réponse ne répondra pas directement à la question posée par l'utilisateur. Mais pour les personnes qui rencontrent cette question ces jours-ci, je tiens à préciser que vous n'avez pas besoin * d'utiliser PSExec si vous utilisez PowerShell . Puisque vous êtes déjà dans PowerShell, utilisez simplement Invoke-Command.

La syntaxe serait 

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

C'est vraiment aussi simple que ça.

* L'activation de l'accès distant PowerShell doit être activée sur le serveur cible.

4
Benjamin Hubbard

Essayez ceci. Vous aviez un % où vous vouliez un $. L'appel cmd.exe est également inutile.

    $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"
}

}
1
Spamwich

utiliser & opérateur (appel), & psexec\$ computer "C:\Folder\install.bat"

0
Craig Hill