OldBlue
OldBlue

Reputation: 35

Running a .bat file on several servers

I am currently trying to run a .bat file on around 150 servers. I can get the script to run through as if there's no issues - the .bat copies to the servers, however it does not seem to be executing at all.

Running on windows 2012 servers mainly.

#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'}

}

I am looking for it to run the .bat once it hits the servers and currently it only seems to be copying over.

Upvotes: 1

Views: 1587

Answers (1)

Moerwald
Moerwald

Reputation: 11254

That's because Start-Process immediately returns. Use the -Wait Parameter.

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

microsoft:

-PassThru

Returns a process object for each process that the cmdlet started. By default, this cmdlet does not generate any output.

-Wait Indicates that this cmdlet waits for the specified process and its descendants to complete before accepting more input. This parameter suppresses the command prompt or retains the window until the processes finish.

-PassThru returns you a process object, where you can check the ExitCode parameter:

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

As an alternative to Start-Process you could also use Invoke-Expression which will return you the stdout of the console.

To check if Invoke-Expression was successful you can use:

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

Upvotes: 1

Related Questions