Используйте 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"
}

}

использовать & (вызов) оператор, & psexec \$компьютер "C:\Folder\install - ... летучая мышь"