запуск пакетного файла из C # - PullRequest
8 голосов
/ 18 августа 2011

ОБНОВЛЕНИЕ ** ПОСМОТРЕТЬ ПРАВИЛЬНЫЙ ОТВЕТ ** У меня есть следующий код в моей службе 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:\\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();
            }


        }
    }

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

Ответы [ 6 ]

4 голосов
/ 18 августа 2011

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

Вам нужно установить p.StartInfo с FileName = "cmd.exe" и Arguments = "c: \\thebatfile.bat "Я верю

2 голосов
/ 23 августа 2011

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

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

p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/C \"c:\\myFile.bat\"";
0 голосов
/ 09 октября 2012

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

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

0 голосов
/ 23 августа 2011

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

0 голосов
/ 18 августа 2011

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

0 голосов
/ 18 августа 2011

Похоже, что при первом запуске службы запускается пакетный скрипт, а затем он завершает работу (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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...