2014-09-05 70 views
2

運行我有一個批處理文件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(); 

無論上述拋出一個異常,但沒有造成預期的輸出文件:

如果我更改裏面的代碼爲類似以下內容並創建相應的空文件bar.txt然後運行通過控制檯確定並如期文字寫入bar.txt

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

「ProcessStartInfo」構造函數的第二個字符串參數是否真的不以「@」開頭?否則你的反斜槓將被吞噬。 – wardies 2014-09-05 15:09:33

+0

另外,您是否嘗試過使用'/ k'參數運行'cmd',以便shell保持不變,您可以查看任何報告的錯誤? – wardies 2014-09-05 15:14:24

+0

@wardies現在測試您的更改 – whytheq 2014-09-05 15:33:54

回答

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";

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"""); 

其中""是在雙引號字符串的嵌入式"