запуск пакетного файла из C#

обновление ** ВСЕ ЕЩЕ ИЩЕТЕ ПРАВИЛЬНЫЙ ОТВЕТ ** У меня есть следующий код в моей службе windows, и я хочу запустить пакетный файл. Я хочу окно командной строки, чтобы я мог видеть прогресс

вот мой код, но мой код пакетного файла не работает

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:folderFolderLog.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:folderFolderLog.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:folderlog.txt", true);
                writer.WriteLine(DateTime.Now + " A new folder/file with name " + e.Name + " has been renamed. ");
                writer.Close();
            }


        }
    }

не выполняет пакетный файл. Я новичок в .net и C#, и я не уверен, что делать отсюда. спасибо

6 ответов


Как запустить консольное приложение из службы Windows?

вы хотите установить С. Информацию с именем="УМК.exe " и аргументы="c:\\thebatfile - ... летучая мышь" я верю


проблема в том, что у вас есть UseShellExecute как false, но вы не передаете имя исполняемого файла.

, когда ShellExecute используется аналогично двойному щелчку по файлу в проводнике - он это знает .файлы doc должны быть открыты с помощью Word, и это .bat файлы должны быть открыты с cmd.exe. Когда у вас это отключено, однако он не знает ничего из этих вещей, и вам нужно передать исполняемый файл для того чтобы что-либо запустить успешно.

как вы настраиваете RedirectStandardOutput для true вам нужно вместо этого запустить пакетный файл через cmd.exe установка FileName to cmd.exe и аргументы к /C "c:\myFile.bat":

p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/C \"c:\myFile.bat\"";

похоже, что он запускает пакетный скрипт при первом запуске службы, а затем завершает работу (p.WaitForExit();), прежде чем другие функции получат возможность быть вызванными. Это намеренное поведение? Это объясняет, почему вы можете видеть, как он выполняет операции с папками, а не запускает скрипт.

попробуйте этот код, чтобы открыть окно консоли. Это должно дать вам представление о том, когда пакетный скрипт работает.

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;

        /*
        This is commented out so we can see what the script is doing
        inside the cmd console.
        */
        //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.

        /*
        Since we aren't redirecting the output, we have to comment out
        this line or we get an error
        */
        //string output = p.StandardOutput.ReadToEnd();

        p.WaitForExit();
}

Я сомневаюсь в вашей службе или bat-файла. изменить исходный код, чтобы открыть блокнот! проверьте, появляется ли Блокнот!! если да, то мы можем исследовать дальше!


Что делает ваш пакетный файл? Предположим, вы подтвердили, что это работает нормально.


службы Windows работают под учетной записью пользователя desktopless. Чтобы увидеть окно cmd, необходимо олицетворить текущего зарегистрированного пользователя и запустить окно cmd на рабочем столе этого пользователя. Смотри:

олицетворение Windows из C#