marric
Goto Top

Remoteverbindung zum Zielhost via Batch: Kommandozeile wird nach Beendigung der Aufgabe nicht geschlossen

Hallo zusammen,

ich stehe aktuell vor einer Herausforderung für die ich derzeit noch keine Lösung finden konnte; vielleicht könnt ihr mir helfen.

Der Sachverhalt sieht in aller Kürze wie folgt aus:

Auf Server 1 wird ein "Batch 1" gestartet, welcher eine Remoteverbindung zu Server 2 aufbaut und dort ein weiteres Batchfile "Batch 2" aufruft.
Das Ganze geschieht über psexec (psexec \\servername -u user -p password "\\server\verzeichnis\batchfile.bat").

"Batch 2" startet dann ein externes Programm auf Server 2 inkl. Produktionsworkflow und führt bestimmte Produktionsparameter aus,
u.a. den Versand einer Status-E-Mail, die aus dem Workflow heraus über die Powershell generiert wird (das Powershell-Skript selbst funktioniert).

Der Knackpunkt ist nun, dass die Kommandozeile auf Server 1 und damit verbunden "Batch 2" nach Prozessbeendigung nicht mehr automatisch geschlossen wird;
das Batchfile an sich wird allerdings bis zum Ende abgearbeitet.

Meine Frage wäre nun, ob psexec in Verbindung mit Powershell derartige Probleme verursachen kann und wie ich dies umgehe
(der Fehler trat erstmals nach Integration des Powershell-Skripts auf)?

Beste Grüße

Content-Key: 272299

Url: https://administrator.de/contentid/272299

Printed on: April 24, 2024 at 05:04 o'clock

Mitglied: 114757
114757 May 19, 2015, updated at May 20, 2015 at 09:17:43 (UTC)
Goto Top
(der Fehler trat erstmals nach Integration des Powershell-Skripts auf)?
Wie sieht das PS Script denn aus ?? Das würde uns hier massiv helfen.

Gruß jodel32
Member: MarRic
MarRic May 20, 2015 at 08:25:31 (UTC)
Goto Top
Das Skript sieht wie folgt aus; vereint allerdings Powershell und die interne Skriptsprache unserer Produktionssoftware. Ich hoffe ihr findet euch zurecht.
(Da das Skript relativ universell Einsetzbar sein sollte, können unter Umständen Variablen leer sein.)


Hier wird der E-Mail-Content definiert (interne Variablen)./


String email_body = "";
String email_subject = "";
String email_to = "";
String email_from = "";
String email_replyto = "";

email_from = "local-part1@domain-part.de";
email_to = "local-part2@domain-part.de";
email_replyto = "local-part3@domain-part.de";

email_subject = "Inhalt | Produktion abgeschlossen | ";

email_body =

"Die Produktion wurde abgeschlossen." + '\n' + '\n' +

"Spool: " + Spool;

String attachment = "";
String filter ="";


/ Powershell: E-Mail wird generiert und versendet.


File.ExecuteContext powershell;

powershell.execute("powershell",

"$username = 'local-part1@domain-part.de'" + '\n' +
"$password = Get-Content '\\server\verzeichnis$\pw.txt'" + '\n' +

"$smtpServer = mailserver.domain-part.de'" + '\n' +
"$message = new-object Net.Mail.MailMessage" + '\n' +
"$smtp = New-Object Net.Mail.SmtpClient($SmtpServer, 587)" + '\n' +
"$smtp.EnableSsl = $true" + '\n' +
"$smtp.Credentials = New-Object System.Net.NetworkCredential($username, $password)" + '\n' +

"$message.From = '" + email_from + "'" + '\n' +
"$message.To.Add('" + email_to + "')" + '\n' +
"$message.ReplyTo = '" + email_replyto + "'" + '\n' +

"$message.Body = '" + email_body + "'" + '\n' +

"$message.Subject = '" + email_subject + "'" + '\n' +

"$path = '" + attachment + "'" + '\n' +
"$filter = '" + filter + "'" + '\n' +

"$files=Get-ChildItem $path -Filter $filter" + '\n' +

E-Mail wird generiert (1. Fall: Attachment = leer)
"if (!$path)" + '\n' +

"{" + '\n' +

"$smtp.Send($message)" + '\n' +
"$message.Dispose();" + '\n' +

"}" + '\n' +

"else" + '\n' +

"{" + '\n' +

E-Mail wird generiert (2. Fall: Attachment-Path gesetzt)
"Foreach($file in $files)" + '\n' +
"{" + '\n' +
"Write-Host 'Attaching File :- ' $file" + '\n' +
"$attachment = New-Object System.Net.Mail.Attachment –ArgumentList $path$file" + '\n' +
"$message.Attachments.Add($attachment)" + '\n' +
"}" + '\n' +

"$smtp.Send($message)" + '\n' +

"$attachment.Dispose();" + '\n' +
"$message.Dispose();" + '\n' +

"}" + '\n'

);

powershell.waitForFinish();

Mitglied: 114757
114757 May 20, 2015 at 11:06:12 (UTC)
Goto Top
powershell.waitForFinish();
Na da wird wohl irgendwo ein Fehler sein, in der Zeile wartet ja das Script bis die Powershell fertig ist, also muss im Powershell-Script irgendwo der Haken sein....
Member: MarRic
MarRic May 20, 2015 at 12:35:49 (UTC)
Goto Top
Das Skript läuft in der Form schon in anderen Workflows ohne Probleme.
Einziger Unterschied ist die aufgebaute Remoteverbindung.

1) Server 1 – Batch 1: Die Windows-Aufgabenplanung startet ein Batch welches im 10-Minuten-Takt bestimmte Hotfolder prüft.

@echo off & setlocal

:: SFTP-Input auf Daten prüfen
Set sftp_inputpath=Y:\Input\
Set imp_outputpath=D:\Imp\
Set rdy_outputpath=D:\Rdy\

if exist "%sftp_inputpath%" dir /b /A:-d "%sftp_inputpath%">nul 2>nul && call D:\Batch\email-report.bat

:Imp
if exist "%imp_outputpath%" dir /b /A:-d "%imp_outputpath%">nul 2>nul && call D:\Batch\zip.bat

:Rdy
if exist "%rdy_outputpath%" dir /b /A:-d "%rdy_outputpath%">nul 2>nul && GOTO FMRemote

:FMRemote
psexec \\Server_2 -u USER -p PW "\\Server_1\Batch\prodabschluss.bat"


2) Server 2 - Batch 2: Per Remoteaufruf wird "prodabschluss.bat" gestartet und damit der Produktionsworkflow mit dem bereits geposteten Skript.

setlocal enablesdelayedexpansion
@echo off

set rdy_outputpath=\\Server_1\Rdy\
set timestamp_archiv=%date:~6,4%-%date:~3,2%-%date:~0,2%
set archiv=\\Server_1\Archiv\%timestamp_archiv%\

cd\
c:
cd C:\Program Files\Produktionssoftware
PROD.exe \\Server_1\workflowdatei.wfd -o Status-E-Mail

For /F %%a in ('dir /B %rdy_outputpath%*.rdy') do (

set filename=%%a
echo !filename!

xcopy %rdy_outputpath%!filename! %archiv%

del /F /Q /S %rdy_outputpath%!filename!

)

echo Batchende


Das Batch wird bis zum Ende abgearbeitet (das habe ich überprüft), die Kommandozeile auf Server 1 allerdings nicht geschlossen.
Sobald ich die "prodabschluss.bat" auf Server 2 manuell, also ohne Remoteaufruf starte, funktioniert das Ganze.

Deshalb meine Vermutung, dass die Powershell in Verbindung mit psexec die eigentliche Fehlerquelle ist.
Mitglied: 114757
114757 May 20, 2015 updated at 12:44:22 (UTC)
Goto Top
So wie Ihr das Powershell aufruft kenne ich das nicht, ist zumindest nicht Standard. Vermutlich liegt da eine Inkompatibilität oder Berechtigungsproblem mit PSEXEC vor, denn ein normal aus einer Batch aufgerufenes Powershell-Script funktioniert hier einwandfrei wenn die Batch via PSEXEC getriggert wird.

Lass dir einfach jede Zeile protokollieren, dann findest du die Stelle an der es hakt.
Member: MarRic
MarRic May 20, 2015 at 13:37:49 (UTC)
Goto Top
Der Aufruf ist etwas umständlich, da gebe ich dir recht. Allerdings gab es keine andere Möglichkeit, da wir diverse Variablen/statistische Auswertungen nur auf diesem Weg an das Mailskript übergeben konnten.

Wie lasse ich mir die Zeilen protokollieren? Wobei ich nicht glaube, dass mich das weiterbringt, da die E-Mail an sich versandt wird.