Basic Stapelverarbeitung in VB.NET

second.name

Lieutenant
Registriert
Sep. 2009
Beiträge
712
Hallo Forum,
kurze Frage: Gibt es eine Möglichkeit, Befehle, die ich eigentlich in einer Batch-Datei ausführe (z.B.: Set, Call, Net User usw.), über VB.NET auszuführen?
Hintergrund: Ich möchte mehr Kontrolle über die Befehlsausführung/Status erhalten (z.B.: den Vorschritt in einer ProgressBar visualisieren). …Oder hat jemand einen anderen Ansatz?
 
Hallo vbuser09,

einerseits steht Dir mit VB.NET das gesamte .NET-Framework zur Verfügung inklusive WMI. Einen Grund noch einen ähnlichen Ansatz zu verfolgen wie mit Batchdateien, sehe ich nicht.

Nenne doch mal Deine konkreten Absichten, dann kann man Dir sicherlich mehr sagen. Solltest Du Dich erst in VB.NET einarbeiten, würde ich Dir empfehlen direkt C# zu wählen. Die .NET-Community ist eine C#-Community.

Grüße
DrTopo
 
Die nächste Steigerung nach Batch wäre ja erstmal VBscript, dass jetzt den Nachfolger Powershell bekommen hat.

Mit Powershell kannst du alles machen, .Net Objekte nutzen, Zugriff auf das neue WinRT auf dem auch Win8 aufbaut, hast gleichzeitig noch die Nähe zur Kommandozeile und Spielchen wie Progressbar sind ebenfalls möglich.

Powershell ist spannend und wird in Firmen immer mehr Thema... Erfahrung in einer gefragten Technologie sind immer hilfreich, falls du beruflich auch in dem Umfeld tätig bist.
 
Shell()
zwischen den Klammern kommt der CMD Befehl.
 
bloß das mit dem Shell Aufruf jedesmal eine neue Instanz aufgemacht wird.

Sprich wenn du mit Shell und set Umgebungsvariablen setzt kannst du auf diese nie wieder zugreifen, da die Instanz direkt nach dem Aufruf wieder weg ist.

Shell eignet sich daher höchstens um eine externe .exe Datei zu starten.
 
Danke für die AW's. Zur Zeit erstellt mein VB-Programm eine BAT-Datei mit folgendem Inhalt:

Code:
SET MarkerPLCStatus=M8000
SET MarkerTTEditStatus=M8000
SET BUTNCCreate=True
SET BUTNCPath=TNC:\BackUpTT\
SET BUPCCreate=True
SET BUPCPath=E:\Actech\TTi\Ctrl_Files\BackUpTT\
SET LogbookChronology=E:\Actech\TTi\Ctrl_Files\Chronology.log
SET LogbookConnection=E:\Actech\TTi\Ctrl_Files\Connection.log
SET BatchDelFile=E:\Actech\TTi\Ctrl_Files\Batch_DelFile.tnccmd
SET BUFileSyntax=%date%_%time:~0,2%-%time:~3,2%-%time:~6,2%.t
SET TNCTTFile=TNC:\TOOL.t
SET Date=%Date%
SET Time=%Time%
SET DelFileExtensionTNC=BUTNC_
SET DelFileExtensionPC=BUPC_
SET TTListFileName=E:\Actech\TTi_neu\TTi_TNCRemoNT\HY3.t
E:\Actech\TTi\Ctrl_Files\TNCcmd.exe @E:\Actech\TTi\Ctrl_Files\Batch_Ctrl.tnccmd -I172.16.0.249 -L1 > E:\Actech\TTi\Ctrl_Files\Connection.log

Dieser Code führt in der untersten Zeile eine EXE aus und übergibt ihr eine Batch mit folgendem Inhalt:

Code:
ECHO ON
ECHO "Start Log File: %LogbookConnection%" > %LogbookConnection%
ECHO "Batch Status = RUN" >> %LogbookConnection%
*-------------------------------------------------------------------------------------------
*Warte bis %MarkerPLCStatus% FALSE ist
ECHO "WAIT ON PLC = RUN" >> %LogbookConnection%
CLS
@MESSAGE "Bitte den NC-Betrieb mit NC-Stop"
@MESSAGE "oder mit Einzelsatz unterbrechen!"
@MESSAGE " "
@MESSAGE "Nach erfolgreicher Uebertragung kann der"
@MESSAGE "NC-Betrieb wieder aufgenommen werden."
@WAIT UNTIL %MarkerPLCStatus% = 0
ECHO "   %MarkerPLCStatus% <> 0 WAIT" >> %LogbookConnection%
Message @Close
ECHO "   %MarkerPLCStatus% = 0 NEXT" >> %LogbookConnection%
*-------------------------------------------------------------------------------------------
*Warte bis %MarkerTTEditStatus% FALSE ist
CLS
@MESSAGE "Bitte die Werkzeugtabelle verlassen,"
@MESSAGE "oder auf 'EDITIEREN AUS' umschalten!"
@WAIT UNTIL %MarkerTTEditStatus% = 0 
ECHO "   %MarkerTTEditStatus% <> 0 WAIT" >> %LogbookConnection%
Message @close
ECHO "   %MarkerTTEditStatus% = 0 NEXT" >> %LogbookConnection%
ECHO "WAIT ON PLC = READY" >> %LogbookConnection%
*-------------------------------------------------------------------------------------------
*Kopiert, wenn %BUTNCCreate% TRUE ist, %TNCTTFile% unter dem Name %BUFileSyntax%, nach %BUTNCPath%
ECHO "COPY %TNCTTFile% %BUTNCPath%%BUFileSyntax% = RUN" >> %LogbookConnection%
ENVGET BUTNCCreate
ON OUTPUT 1 "FALSE" GOTO WithoutBUTNC
COPY  %TNCTTFile% %BUTNCPath%%BUFileSyntax%
ECHO "COPY %TNCTTFile% %BUTNCPath%%BUFileSyntax% = READY" >> %LogbookConnection%
ECHO "%DelFileExtensionTNC%%BUTNCPath%%BUFileSyntax%" >> %LogbookChronology%
ON ALWAYS GOTO BUTNCCreateOk
*-------------------------------------------------------------------------------------------
:WithoutBUTNC
ECHO "COPY %TNCTTFile% %BUTNCPath%%BUFileSyntax% = COPY CANCEL" >> %LogbookConnection%
:BUTNCCreateOk
*-------------------------------------------------------------------------------------------
*Kopiert, wenn %BUTNCCreate% TRUE ist, %TNCTTFile% unter dem Name %BUFileSyntax%, nach %BUPCPath%
ECHO "GET %TNCTTFile% %BUPCPath%%BUFileSyntax% = RUN" >> %LogbookConnection%
ENVGET BUPCCreate
ON OUTPUT 1 "FALSE" GOTO WithoutBUPC
GET %TNCTTFile% %BUPCPath%%BUFileSyntax%
ECHO "GET %TNCTTFile% %BUPCPath%%BUFileSyntax% = READY" >> %LogbookConnection%
ECHO "%DelFileExtensionPC%%BUPCPath%%BUFileSyntax%" >> %LogbookChronology%
ON ALWAYS GOTO BUPCCreateOk
*-------------------------------------------------------------------------------------------
:WithoutBUPC
ECHO "GET %TNCTTFile% %BUPCPath%%BUFileSyntax% = COPY CANCEL" >> %LogbookConnection%
:BUPCCreateOk
*-------------------------------------------------------------------------------------------
*Synchronisiert %TNCTTFile% mit %TTListFileName%
ECHO "PUT %TTListFileName% %TNCTTFile% = RUN" >> %LogbookConnection%
PUT %TTListFileName% %TNCTTFile% /m
ECHO "PUT %TTListFileName% %TNCTTFile% = READY" >> %LogbookConnection%
*-------------------------------------------------------------------------------------------
*Lösche die Dateien, welche in %BatchDelFile% aufgeführt sind
ECHO "#INCLUDE %BatchDelFile% = RUN" >> %LogbookConnection%
#INCLUDE %BatchDelFile%
ECHO "#INCLUDE %BatchDelFile% = READY" >> %LogbookConnection%
*-------------------------------------------------------------------------------------------
ECHO "Batch Status = READY" >> %LogbookConnection%
ECHO "End Log File: %LogbookConnection%, %Date% %Time%" >> %LogbookConnection%
*-------------------------------------------------------------------------------------------
EXIT

Ist es möglich, dies direkt über VB.NET oder C# ;) auszuführen?
 
Hallo,

sorry, damit kann ich nun wenig anfangen. Beschreibe doch einfach was genau Du in der Batch machst. Ich habe eigentlich keine Lust mich da durchzulesen. Zumal da teilweise auch Anweisungen drin sind, die durch diese komische EXE-Datei unterstützt werden und nicht defaultmäßig von CMDs angeboten werden.

Sicherlich wäre es möglich diese Batch einfach über einen Prozess, der durch C# gestartet wird, auszuführen und dann die Pipe abzufangen und auszuwerden. Dies wäre aber definitiv nicht der richtige Weg.

Grüße
DrTopo
 
Sorry - mein Fehler! Eigentlich wollt ich nur zum Ausdruck bringen, dass mein Programm eine BAT generiert, diese ausführt und die BAT selbst wiederum eine weitere EXE startet, der eine /Batch-Datei übergeben wird (siehe Anhang). Gibt es eine Möglichkeit - ohne Pipes ;), dies im Framework zu erledigen?
 

Anhänge

  • Bild.JPG
    Bild.JPG
    25,3 KB · Aufrufe: 174
Ich hab mich jetzt mal mit PowerShell und der Verwendung im Framework beschäftigt. Damit ich jedoch aus .NET auf die „PowerShell“-Namespaces zugreifen und verwenden kann, muss ich das „Windows Management-Frameworks“ installieren. (http://support.microsoft.com/kb/968929)
Komischerweise wird dies für Windows 7 nicht unterstütz? Kann mir jemand sagen warum und eventuell eine andere Möglichkeit nennen?
Danke!
 
WinRM und Bits 4.0 sind in Windows 7 enthalten.

Du sollst auch nicht von .Net aus auf die Powershell zugreifen, sondern umgekehrt.
 
Versteh ich nicht? …Der Grund dieses Themas war, dass ich aus VB.NET die o.g. Stapelverarbeitungsbefehle ausführen wollte. In diesem Zusammenhang viel, dass das mit der PowerShell möglich ist!? Wie führe ich denn nun die o.g. Befehle aus VB.Net aus?
Ergänzung ()

Ich habe in diesem Zusammenhang immer wieder den Namespace "System.Management.Automation" gefunden. Wenn die Komponenten des Windows Management Frameworks installiert sind, müsste ich auch Zugriff darauf haben - oder nicht? ...Doch IntelliSense zeigt nix an!
 
vbuser09,

google mal nach "Referenz hinzufügen VS2010". :-) Einfach die entsprechende Assembly aus dem .NET-Framework Deinem Projekt als Referenz hinzufügen, erst dann ist die Assembly (.NET-DLL) dem Projekt bekannt und erst dann kannst Du Dinge (Typen) aus den logischen Containern (Namespaces) in dieser Assembly nutzen. :-)

Grüße
DrTopo
 
Zurück
Oben