Запуск файла .bat на нескольких серверах - PullRequest
1 голос
/ 13 мая 2019

В настоящее время я пытаюсь запустить файл .bat на 150 серверах. Я могу заставить скрипт работать так, как будто нет проблем - .bat копирует на серверы, но, похоже, он вообще не выполняется.

В основном работает на серверах Windows 2012.

#Variables
$servers = "D:\Apps\Davetest\servers.txt"
$computername = Get-Content $servers
$sourcefile = "D:\Apps\Davetest\test.bat"
#This section will install the software 
foreach ($computer in $computername) 
{
    $destinationFolder = "\\$computer\C$\Temp"
    <#
       It will copy $sourcefile to the $destinationfolder. If the Folder does 
       not exist it will create it.
    #>

    if (!(Test-Path -path $destinationFolder))
    {
          New-Item $destinationFolder -Type Directory
    }
    Copy-Item -Path $sourcefile -Destination $destinationFolder
    Invoke-Command -ComputerName $computer -ScriptBlock {Start-Process 'c:\Temp\test.bat'}

}

Я ищу, чтобы он запускал .bat, когда он попадает на серверы, и в настоящее время он только копирует.

1 Ответ

1 голос
/ 13 мая 2019

Это потому, что Start-Process немедленно возвращается.Используйте параметр -Wait.

Start-Process -FilePath 'c:\Temp\test.bat' -NoNewWindow -Wait -PassThru

microsoft :

-PassThru

Возвращает объект процесса для каждого процесса, которыйКомандлет запущен.По умолчанию этот командлет не создает никаких выходных данных.

-Wait Указывает, что этот командлет ожидает завершения указанного процесса и его потомков, прежде чем принимать дополнительные входные данные.Этот параметр подавляет командную строку или сохраняет окно до завершения процессов.

-PassThru возвращает вам объект процесса, где вы можете проверить параметр ExitCode:

$p = Start-Process -FilePath your_command -ArgumentList "arg1", "arg" -NoNewWindow  -Wait -PassThru
if ($p.ExitCode -ne 0) {
   throw "Failed to clone $buildItemName from $buildItemUrl to $($tmpDirectory.FullName)"
}

В качестве альтернативы Start-Process вы также можете использовать Invoke-Expression, который вернет вам стандартный вывод консоли.

Чтобы проверить, успешно ли Invoke-Expression вы можете использовать:

 $output = Invoke-Expression $command
 if ((-not $?) -or ($LASTEXITCODE -ne 0)) {
        throw "invoke-expression failed for command $command. Command output: $output"
 }
...