批处理未从控制台运行

时间:2014-09-05 14:59:20

标签: c# batch-file

我有一个批处理文件foo1.bat,其中包含:

@echo off
  echo.>"\\xxx\xxx$\xxx\xxxx\xxxx\BATScipt Files\dblank.txt"

如果我双击该文件,则会按预期创建dblank.txt

在我的Console App中,我尝试了两种不同的方法:

1

System.Diagnostics.Process.Start(@"\\xxx\xxx$\xxx\xxxx\xxxx\BATScipt Files\foo1.bat");

2

ProcessStartInfo ProcessInfo;
Process process;
ProcessInfo = new ProcessStartInfo("cmd.exe","/c \\xxx\xxx$\xxx\xxxx\xxxx\BATScipt Files\foo1.bat");
ProcessInfo.CreateNoWindow = true;
ProcessInfo.UseShellExecute = false;
ProcessInfo.WorkingDirectory = aPath;
process = Process.Start(ProcessInfo);
process.WaitForExit();
process.Close();

以上两种情况都不会引发异常,但都不会创建预期的输出文件:

如果我将foo1.bat内的代码更改为以下内容并创建相应的空文件bar.txt,则可以通过控制台运行,并按预期将文本写入bar.txt

@echo off
setlocal enableextensions
(
    systeminfo | findstr .... 
    echo %a%
    echo %b%
    echo %c%
) > "%~dp0\bar.txt"

2 个答案:

答案 0 :(得分:2)

此代码适用于我:

Process p = new Process();
p.StartInfo.FileName = "C:\\execute.bat";
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.Start();

检查共享文件夹权限

这也有效p.StartInfo.FileName = "\\\\xxxx\\xxx\\execute.bat";

答案 1 :(得分:2)

在我看来,你需要更多的双引号:

ProcessInfo = new ProcessStartInfo("cmd.exe","/c \\xxx\xxx$\xxx\xxxx\xxxx\BATScipt Files\foo1.bat");

引用了您的第二个参数,这是有意义的,但是您使用cmd /c开始一个新流程,然后将其包含空格\\xxx\xxx$\xxx\xxxx\xxxx\BATScipt Files\foo1.bat

这意味着您确实告诉cmd使用\\xxx\xxx$\xxx\xxxx\xxxx\BATScipt参数执行Files\foo1.bat

所以你也必须在论证的那一部分附加引号。您可以构建字符串或只是添加双引号对,或者如您在第一个选项中所做的那样,使用@符号。我可能会这样做:

ProcessInfo = new ProcessStartInfo("cmd.exe","/c ""\\xxx\xxx$\xxx\xxxx\xxxx\BATScipt Files\foo1.bat""");

其中""是双引号字符串中嵌入的"