简体   繁体   中英

PowerShell script executing batch script on remote server

I am executing a PowerShell script which executes a batch script at remote server. But in PowerShell script I am not able to handle any failure that could occur in batch script. The batch script is having exit %ERROR_CODE% at the end.

Please let me know how I can catch any error occurred in batch script in the calling PowerShell script.

My PowerShell script is like:

$DBServer = $args[0]
$CustName = $args[1]
$FullBackupPath = $args[2]

$command = "cmd.exe /c DbBackupBatch.cmd " + $FullBackupPath + " " + $CustName

$script = 'Invoke-Expression -Command "' + $command + '"'
$scriptblock = [scriptblock]::Create($script)

try {
    Invoke-Command -ComputerName $DBServer -Authentication NegotiateWithImplicitCredential -ErrorAction Stop -ScriptBlock $scriptblock
    exit 0
} catch {
    $message = $_.Exception.Message

    Write-Host $_.Exception.Message 

    # While executing a Java programs, we get message as below -
    # Picked up JAVA_TOOL_OPTIONS: -Xms512m -Xmx512m
    # This message is treated as error message by PowerShell, though it is not an error
    if (($message.Length -lt 50) -and ($message.Contains('Picked up JAVA_TOOL_OPTIONS:'))) {
        exit 0
    } else {
        Write-Host $_.Exception.Message 
        exit 1
    }
}

Give this a whirl:

$remoteReturnValue = Invoke-Command -ComputerName "DV1IMPSSDB01" -Authentication NegotiateWithImplicitCredential -ScriptBlock {
    $cmd = Start-Process "cmd.exe" -Wait -PassThru -ArgumentList "/c timeout 5"
    $cmdExitCode = $cmd.ExitCode

    if ($cmdExitCode -eq 0) {
        return "Success"
    }
    else {
        return "Wuh-oh, we have had a problem... exit code: $cmdExitCode"
    }
}

Write-Host $remoteReturnValue -ForegroundColor Magenta

Whatever you're trying to do in PowerShell, Invoke-Expression is practically always the wrong approach. PowerShell can execute batch files all by itself, so you can run DbBackupBatch.cmd directly, without Invoke-Expression and even without cmd /c .

Try something like this:

$DBServer = $args[0]
$CustName = $args[1]
$FullBackupPath = $args[2]

try {
    Invoke-Command -ComputerName $DBServer -ScriptBlock {
        $output = & DbBackupBatch.cmd $args[0] $args[1] 2>&1
        if ($LastExitCode -ne 0) { throw $output }
    } -ArgumentList $FullBackupPath, $CustName -Authentication NegotiateWithImplicitCredential
} catch {
    Write-Host $_.Exception.Message 
    exit 1
}

exit 0

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM