Используйте Powershell для запуска команды Psexec
первый пост, поэтому, пожалуйста, не трогайте меня. Я искал вокруг, но не могу найти способ сделать то, что я хочу. Я сделал скрипт, который копирует папку, которую я имею на многочисленные компьютеры в $computerc$. В этих папках есть пакетный файл, который запускает .исполняемый. То, что я хочу сделать, это получить Powershell с тех же компьютеров.txt, который я использовал для копирования папки, а затем использовал psexec для запуска пакетного файла. Я мог бы сделать это все вручную, но скриптинг, похоже, проблема, вот что я думал бы работа, но, по-видимому, нет.
$computers = gc "C:scriptscomputers.txt"
foreach ($computer in $computers) {
if (test-Connection -Cn $computer -quiet) {
cd C:pstools
psexec %computer cmd
C:Folderinstall.bat"
} else {
"$computer is not online"
}
}
4 ответов
Хорошо, давайте начнем с самого начала.
$computers = gc "C:\scripts\computers.txt"
это загружает содержимое " компьютеров.txt " файл в переменную $computers
. Достаточно просто, никаких проблем.
Далее у нас есть цикл ForEach. Он разбивает содержимое $computers
и обрабатывает каждую строку (предположительно имя компьютера), а $computer
против всего кода в фигурных скобках.
foreach ($computer in $computers) {
этот цикл начинается со стандартного оператора If-Then. Если (condition)
затем {do stuff}
. В этом случае он тестирует, чтобы увидеть, если $computer
доступно в сети. Если это так, то он пытается запустить PSExec на нем. Если он не в сети, он запускает предложение Else, мы доберемся до этого через секунду.
if (test-Connection -Cn $computer -quiet) {
затем он меняет директорию. Бессмысленно, но ладно, неважно. Вы могли бы просто вызвать его явно, например C:\PSTools\PSExec.exe <arguments>
и сохранил строку, но на самом деле никакого вреда не было.
cd C:\pstools
тогда вы вызываете PSExec, хотя есть немного синтаксическая ошибка здесь. Он должен быть!--9-->, а не %computer
. Кроме того, он должен иметь только команду, которую вы хотите выполнить, а не cmd
и команда на второй строке. У вас могут быть лучшие результаты, если вы используете оператор вызова (&
), чтобы powershell понял, что он пытается выполнить что-то, а не запускать командлет или функцию или что-то еще.
& psexec \$computer C:\Folder\install.bat
после этого есть предложение Else, которое говорит, что если компьютер не подключен к сети, чтобы написать строку " $computer не подключен" затем закрываются фигурные скобки для предложения Else и цикла ForEach.
} else {
"$computer is not online"
}
}
Edit: Ok, ваш готовый скрипт должен выглядеть примерно так (заключенная цель в кавычки, если в пути есть пробелы):
$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"
}
}
Я понимаю, что этот вопрос с 2014 года, и этот ответ не будет напрямую обращаться к вопросу, заданному пользователем. Но для людей, которые сталкиваются с этим вопросом в эти дни, я хочу выбросить там это вам не нужно* использовать PSExec, если вы используете PowerShell. Поскольку вы уже находитесь в PowerShell, просто используйте Invoke-Command
.
синтаксис будет
Invoke-Command -ComputerName $Computer -ScriptBlock { C:\Folder\install.bat }
Это действительно так просто.
*требуется включить удаленное взаимодействие PowerShell на целевом объекте сервер.
попробуйте. У тебя был %
где вы хотели $
. Также в УМК.exe вызов не нужен.
$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"
}
}