ausführen einer batch-Datei aus C#
UPDATE
** NOCH AUF DER SUCHE FÜR EINE RICHTIGE ANTWORT **
Ich habe den folgenden code in meine windows-Dienst, und ich möchte ausführen einer batch-Datei. Ich will das Fenster der Eingabeaufforderung, damit ich sehen kann den Fortschritt
hier ist mein code, aber meine batch-Datei-code funktioniert nicht
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.IO;
namespace Watcher
{
public partial class Watcher : ServiceBase
{
public Watcher()
{
InitializeComponent();
FolderWatcher.Created += FolderWatcher_Created;
FolderWatcher.Deleted += FolderWatcher_Deleted;
FolderWatcher.Renamed += FolderWatcher_Renamed;
}
protected override void OnStart(string[] args)
{
//Start the child process.
Process p = new Process();
//Redirect the output stream of the child process.
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "C:\\myFile.bat";
p.Start();
//Do not wait for the child process to exit before
//reading to the end of its redirected stream.
//p.WaitForExit();
//Read the output stream first and then wait.
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
}
protected override void OnStop()
{
}
private void FolderWatcher_Created(object sender, System.IO.FileSystemEventArgs e)
{
TextWriter writer = new StreamWriter("C:\\folder\\FolderLog.txt", true);
writer.WriteLine(DateTime.Now + " A new folder/file with name " + e.Name + " has been created. ");
writer.Close();
}
private void FolderWatcher_Deleted(object sender, System.IO.FileSystemEventArgs e)
{
TextWriter writer = new StreamWriter("C:\\folder\\FolderLog.txt", true);
writer.WriteLine(DateTime.Now + " A new folder/file with name " + e.Name + " has been deleted. ");
writer.Close();
}
private void FolderWatcher_Renamed(object sender, System.IO.RenamedEventArgs e)
{
TextWriter writer = new StreamWriter("C:\\folder\\log.txt", true);
writer.WriteLine(DateTime.Now + " A new folder/file with name " + e.Name + " has been renamed. ");
writer.Close();
}
}
}
Es nicht führen Sie die batch-Datei. Ich bin ein Neuling in .net und C#, und ich bin nicht sicher, was zu tun ist von hier.
Dank
- Können Sie in irgendeiner Weise bestätigen, dass der Dienst ausgeführt wird?
- service läuft einwandfrei. Ich kann es starten es von der Kommandozeile aus. Ich kann umbenennen / löschen / Ordner hinzufügen, und es protokolliert die info. Also ich bin 100% sicher, dass der Dienst ausgeführt wird just fine
- Nur als Anmerkung: sollten Sie wickeln Sie Ihre
StreamWriter
s inusing
sonst könnte man offen lassen, Datei-handles herum.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie führen Sie console-Anwendung von Windows-Dienst?
Werden Sie wollen, um die set-die p.StartInfo mit FileName="cmd.exe" und Argumente="c:\\thebatfile.bat" ich glaube,
/C "c:\myFile.bat"
(die/C
fehlte).Das problem ist, dass Sie
UseShellExecute
als falsch, aber sind Sie nicht, wobei Sie den Namen einer ausführbaren Datei.Wenn
ShellExecute
verwendet wird, die ähnlich einem Doppelklick auf eine Datei im explorer - Sie weiß, dass .doc Dateien werden mit Word geöffnet, und das .bat-Dateien müssen geöffnet werden, mitcmd.exe
. Wenn man diesen deaktiviert, aber es weiß nichts von diesen Dingen, und Sie brauchen, um passieren eine ausführbare damit etwas erfolgreich ausgeführt werden.Als Sie
RedirectStandardOutput
zu wahren, müssen Sie stattdessen führen Sie die batch-Datei übercmd.exe
durch EinstellungFileName
zucmd.exe
und die Argumente für/C "c:\myFile.bat"
:Sieht es aus wie es läuft die batch-Skript, wenn der Dienst zuerst ausgeführt und dann beendet wird (
p.WaitForExit();
), bevor die anderen Funktionen auch die Möglichkeit genannt werden. Ist, dass das beabsichtigte Verhalten? Das würde erklären, warum Sie es sehen kann, tun die Ordner-Operationen und nicht sehen, das Skript ausgeführt wird.Versuchen, diesen code, um das Konsole-Fenster. Es sollte Ihnen eine Idee geben, wenn das batch-Skript ausgeführt wird.
ich bin der Ungläubige Ihre service-oder bat-Datei. ändern Sie die Quelle code öffnen Sie einen Editor! überprüfen Sie, ob Editor angezeigt!! wenn ja, dann können wir weiter untersuchen!
Was ist Ihre batch-Datei zu tun? Angenommen, Sie haben bestätigt, dass dies ausgeführt WIRD, OK.
Windows-Dienste laufen unter einem desktopless Benutzerkonto. Um zu sehen, das cmd-Fenster müssen Sie die Identität des aktuell angemeldeten Benutzer und starten Sie das cmd-Fenster auf das desktop des Benutzers. Sehen:
Die Windows-Identitätswechsel von C#