r.abhaysinghania Ответов: 1

CMD.EXE был запущен с приведенным выше путем так как текущий каталог UNC пути не поддерживаются по умолчанию для каталога windows


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

Я прилагаю свой код ниже.
Файл service1.в CS

public partial class Service1 : ServiceBase
   {
       private Timer timer1 = null;

       public Service1()
       {
           InitializeComponent();
       }

       protected override void OnStart(string[] args)
       {
           timer1 = new Timer();
           this.timer1.Interval = 60000; //60 sec
           this.timer1.Elapsed +=new System.Timers.ElapsedEventHandler(this.timer1_Tick);
           timer1.Enabled=true;
           Library.WriteErrorLog("test windows service started");
           var result = RunProcess(@"\\192.168.124.30\IT\WebCommon\webfolder" /*the network path*/, "webupknvp.Bat", "cmd.exe", false);
                                  // my path C:\Abhay\batfile
           if (result == 0)
           {
               // success
               Console.WriteLine("Sucess");
           }
           else
           {
               // failed ErrorLevel / app ExitCode
               Console.WriteLine("failed try again");

           }


       }

       protected override void OnStop()
       {
           timer1.Enabled = false;
           Library.WriteErrorLog("Test Service ended");
       }

       public void timer1_Tick(object sender, ElapsedEventArgs e)
       {
           //job
       /*   var result = RunProcess(@"C:\Abhay\batfile", "webupknvp.Bat", "", false);
           if (result == 0)
           {
               // success
               Console.WriteLine("Sucess");
           }
           else
           {
               // failed ErrorLevel / app ExitCode
               Console.WriteLine("failed try again");

           }
       */

       }

       public int RunProcess(string workDir, string appName, string args, bool hide = false)
           {

                  // Process proc = null;
                   Process proc = new Process();
                  // string batrun = string.Format("/c" + @"C:\Abhay\batfile", "cmd.exe"); // or @"C:\Abhay\batfile" in the end ("cmd.exe", "/c" + @"C:\Abhay\batfile")
                   proc.StartInfo.UseShellExecute = false;   //addition
                  args = "/c";
                   appName = "cmd.exe";
                   workDir = @"\\192.168.124.30\IT\WebCommon\webfolder";
                   proc.StartInfo.WorkingDirectory = workDir;//batrun
                   proc.StartInfo.FileName = appName;
                   proc.StartInfo.Arguments = args;
                   proc.StartInfo.CreateNoWindow = hide;

                   proc.Start();
                   proc.WaitForExit();

                   return proc.ExitCode;
              }


Библиотека. cs

public static class Library
   {
       public static void WriteErrorLog(Exception ex)
       {
           StreamWriter sw = null;
           try
           {
               sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\ Logfile.txt", true);
               sw.WriteLine(DateTime.Now.ToString() + ":" + ex.Source.ToString().Trim() + ";" + ex.Message.ToString().Trim());
               sw.Flush();
               sw.Close();

           }
           catch
           {

           }
       }

       public static void WriteErrorLog(string Message)
       {
           StreamWriter sw = null;
           try
           {

               sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\ Logfile.txt", true);
               sw.WriteLine(DateTime.Now.ToString() + ":" + Message);
               sw.Flush();
               sw.Close();
           }
           catch
           {

           }
       }

Программа. cs

static void Main(String[] args)
        {
            // Initialize the service to start
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
    { 
        new Service1() 
    };

            // In interactive mode ?
            if (Environment.UserInteractive)
            {
                // In debug mode ?
                if (System.Diagnostics.Debugger.IsAttached)
                {
                    // Simulate the services execution
                    RunInteractiveServices(ServicesToRun);
                }
                else
                {
                    try
                    {
                        bool hasCommands = false;
                        // Having an install command ?
                        if (HasCommand(args, "install"))
                        {
                            ManagedInstallerClass.InstallHelper(new String[] { typeof(Program).Assembly.Location });
                            hasCommands = true;
                            // Having a start command ?
                            if (HasCommand(args, "start"))
                            {
                                foreach (var service in ServicesToRun)
                                {
                                    ServiceController sc = new ServiceController(service.ServiceName);
                                    sc.Start();
                                    sc.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(10));
                                }
                                hasCommands = true;
                            }
                        }
                        // Having a stop command 
                        if (HasCommand(args, "stop"))
                        {
                            foreach (var service in ServicesToRun)
                            {
                                ServiceController sc = new ServiceController(service.ServiceName);
                                sc.Stop();
                                sc.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10000));// change 
                            }
                            hasCommands = false;
                        }
                        // Having an uninstall command 
                        if (HasCommand(args, "uninstall"))
                        {
                            ManagedInstallerClass.InstallHelper(new String[] { "/u", typeof(Program).Assembly.Location });
                            hasCommands = true;
                            
                            
                        }
                        // If we don't have commands we print usage message
                        if (!hasCommands)
                        {
                            Console.WriteLine("Usage : {0} [command] [command ...]", Environment.GetCommandLineArgs());
                            Console.WriteLine("Commands : ");
                            Console.WriteLine(" - install : Install the services");
                            Console.WriteLine(" - uninstall : Uninstall the services");
                        }
                    }
                    catch (Exception ex)
                    {
                        var oldColor = Console.ForegroundColor;
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("Error : {0}", ex.GetBaseException().Message);
                        Console.ForegroundColor = oldColor;
                    }
                }
            }
            else
            {
                // Normal service execution
                ServiceBase.Run(ServicesToRun);
            }
        }

        static void RunInteractiveServices(ServiceBase[] servicesToRun)
        {
            Console.WriteLine();
            Console.WriteLine("Start the services in interactive mode.");
            Console.WriteLine();

            // Get the method to invoke on each service to start it
            MethodInfo onStartMethod = typeof(ServiceBase).GetMethod("OnStart", BindingFlags.Instance | BindingFlags.NonPublic);

            // Start services loop
            foreach (ServiceBase service in servicesToRun)
            {
                Console.Write("Starting {0} ... ", service.ServiceName);
                onStartMethod.Invoke(service, new object[] { new string[] { } });
                Console.WriteLine("Started");
            }

            // Waiting the end
            Console.WriteLine();
            Console.WriteLine("Press a key to stop services and finish process...");
            Console.ReadKey();
            Console.WriteLine();

            // Get the method to invoke on each service to stop it
            MethodInfo onStopMethod = typeof(ServiceBase).GetMethod("OnStop", BindingFlags.Instance | BindingFlags.NonPublic);

            // Stop loop
            foreach (ServiceBase service in servicesToRun)
            {
                Console.Write("Stopping {0} ... ", service.ServiceName);
                onStopMethod.Invoke(service, null);
                Console.WriteLine("Stopped");
            }

            Console.WriteLine();
            Console.WriteLine("All services are stopped.");

            // Waiting a key press to not return to VS directly
            if (System.Diagnostics.Debugger.IsAttached)
            {
                Console.WriteLine();
                Console.Write("=== Press a key to quit ===");
                Console.ReadKey();
            }
        }
        static bool HasCommand(String[] args, String command)
        {
            if (args == null || args.Length == 0 || String.IsNullOrWhiteSpace(command)) return false;
            return args.Any(a => String.Equals(a, command, StringComparison.OrdinalIgnoreCase));


        }
        
    }
}


Что я уже пробовал:

Я застрял здесь, понятия не имея, как это решить.

Richard MacCutchan

Сообщение говорит вам, в чем проблема, вы не можете использовать UNC-пути.

r.abhaysinghania

ладно, можно ли это решить?

Richard MacCutchan

Да, не используйте UNC-пути.

[no name]

В любом случае, почему вы запускаете cmd для выполнения bat-файла?

r.abhaysinghania

служба windows запускает bat-файл через cmd, теперь я пытаюсь заставить его работать на сетевом сервере.

[no name]

И это отвечает на вопрос, как?

1 Ответов

Рейтинг:
2

OriginalGriff

Сообщение об ошибке довольно ясно:

CMD.EXE was started with the above path as the current directory UNC paths are not supported defaulting to windows directory

Глядя на ваш код:
workDir = @"\\192.168.124.30\IT\WebCommon\webfolder";
proc.StartInfo.WorkingDirectory = workDir;//batrun
Вы специально пытаетесь начать это с помощью UNC-путь[^] - \\192.168.124.30
Ты не можешь этого сделать.
Вы можете сделать это, если сопоставите букву диска с общим ресурсом UNC и получите через нее доступ к пакетному файлу, но имейте в виду, что пакетный файл и приложения, которые он запускает, все равно будут работать на вашем локальном компьютере, а не на удаленной машине.


r.abhaysinghania

Я пытался сопоставить письмо с unc вот так". Z:\\192.168.124.30\IT\WebCommon\webfolder";

OriginalGriff

Это не подключенный диск:
http://www.laptopmag.com/articles/map-network-drive-windows-10

r.abhaysinghania

У меня уже есть подключенный диск. имя Common (\\192.168.124.30\IT) (X:)

r.abhaysinghania

спасибо Вам за помощь, ребята... Я искал UNC на cmd и нашел кое-что на msdn, что cmd не поддерживает UNC.

Richard MacCutchan

Именно это я и сказал тебе два часа назад.

OriginalGriff

..... и то, что сообщение об ошибке сообщало ему по крайней мере за час до этого.: вздох:

Richard MacCutchan

:вздох: действительно, а иногда даже "аааррггхх".

r.abhaysinghania

спасибо вам, ребята, за помощь.