2015-04-21 58 views
0

我有一個控制檯應用程序和一個Winforms應用程序也是這樣做的。通用功能是在一個類中被兩者重用。爲什麼批處理文件在從Windows Forms應用程序調用時不能複製文件,但它可以從控制檯應用程序中運行?

CopyRequiredFile啓動一個windows批處理文件,它使用xcopy將文件從網絡文件夾複製到本地驅動器。但是,從Windows窗體應用程序調用時,它不會複製文件

我是新手開發者試圖開發框架和UI自動化的一些內部工具。

爲什麼在我從控制檯應用程序調用功能時複製文件,而不是從Windows窗體應用程序中複製文件?

我的控制檯應用程序:

public class Program 
    { 
     private static readonly Action<string> OutputAction = s => Console.WriteLine(s); 
     private static readonly IProgress<string> Progress = new Progress<string>(OutputAction); 

     public static void Main(string[] args) 
     { 
      HelpersCopy.CreateRequiredDirectories(Progress); 
      HelpersCopy.CopyRequiredFiles(Progress, true); 
      HelpersCopy.StartHub(Progress); 
      HelpersCopy.StartNode(Progress); 

      Console.WriteLine("Press any key to continue..."); 
      Console.ReadKey(); 
     } 
    } 

我的Windows窗體應用程序:只有是有關這個問題的代碼。

private void button1_Click(object sender, EventArgs e) 
     { 
      Action<string> outputAction = s => txtOutput.InvokeEx(t => t.Text += s + Environment.NewLine); 
      IProgress<string> progress = new Progress<string>(outputAction); 

      txtOutput.Clear(); 
      HelpersCopy.CreateRequiredDirectories(progress); 
      HelpersCopy.CopyRequiredFiles(progress, true); 
      HelpersCopy.StartHub(progress); 
      HelpersCopy.StartNode(progress); 
     } 

InvokeEx是一個擴展方法來調用動作,如果需要的話。從stackoverflow幫助!

不幸的是,我無法發佈圖片,因爲我沒有要求的要點。因此,請在這裏看到的輸出圖像:https://www.flickr.com/photos/[email protected]/sets/72157649781440604/

助手類代碼請讓我知道,如果在這個問題並不需要此代碼。

public class HelpersCopy 
    { 
     public static void CopyRequiredFiles(IProgress<string> progress, bool hideWindow = false) 
     { 
      progress.Report(string.Format("Copying latest version of executables...{0}", Environment.NewLine)); 
      var currentDirectory = Directory.GetCurrentDirectory(); 
      ExecuteCommand(String.Format(@"{0}\Copy latest Selenium files.bat", currentDirectory), progress, hideWindow: hideWindow); 
      progress.Report(string.Format("\r\nLatest version of executables copied successfully{0}", Environment.NewLine)); 
     } 

     private static void ExecuteCommand(string fileName, IProgress<string> progress, string command = null, bool hideWindow = true) 
     { 
      if (hideWindow) 
      { 
       var processInfo = new ProcessStartInfo(fileName, command) 
       { 

        CreateNoWindow = true, 
        UseShellExecute = false, 
        // *** Redirect the output *** 
        RedirectStandardError = true, 
        RedirectStandardOutput = true 
       }; 

       var process = new Process { StartInfo = processInfo, EnableRaisingEvents = true }; 
       process.ErrorDataReceived += (sender, args) => progress.Report(args.Data); 
       process.OutputDataReceived += (sender, args) => progress.Report(args.Data); 
       var started = process.Start(); 
       progress.Report(string.Format("process started: {0}", started)); 
       progress.Report(string.Format("process id: {0}", process.Id)); 
       progress.Report(string.Format("process start info: {0} {1}", process.StartInfo.FileName, process.StartInfo.UserName)); 
       process.BeginErrorReadLine(); 
       process.BeginOutputReadLine(); 
       process.WaitForExit(); 

       int ExitCode = process.ExitCode; 

       progress.Report(string.Format("ExitCode: {0}{1}", ExitCode, Environment.NewLine)); 
       process.Close(); 
      } 
      else 
      { 
       var process = Process.Start(fileName, command); 
       if (process.HasExited) 
       { 
        throw new Exception(string.Format("Process exited. Exit code: {0}", process.ExitCode)); 
       } 
      } 
     } 
    } 

我的批處理文件

@echo off 

echo Deleting existing mappings... 

net use z: /delete /yes 

echo Mapping network drives... 

net use z: \\company-filestore\Selenium /user:company-filestore\Automation Selen1um 

z: 
cd "Hub and Node Executables" 

echo Copying latest Selenium jars... 
xcopy "z:\Hub and Node Executables" "C:\Selenium\" /R /Y /S /Z 
echo Finished copying latest Selenium jars... 

echo All done 
+7

請問您可以將這個問題稍微壓縮一下,以強調重要的部分?有很多噪音 – DLeh

+0

當然@DLeh。我會嘗試刪除不必要的代碼,並適當地聲明所需的行爲。 – raluru

+0

我試着重寫你的問題的陳述,所以它更清楚,希望這有助於。 – Dzyann

回答

2

winforms應用程序中的問題(儘管在控制檯應用程序中使用相同的代碼從來沒有任何問題)是由xcopy中的錯誤引起的,因爲當您重定向其輸出時,還需要重定向其輸入。因此,將此行添加到我的代碼中的ProcessInfo對象中,解決了問題。在這個問題上

RedirectStandardInput = true 

的更多信息是在這裏:https://social.msdn.microsoft.com/Forums/vstudio/en-US/ab3c0cc7-83c2-4a86-9188-40588b7d1a52/processstart-of-xcopy-only-works-under-the-debugger?forum=netfxbcl

希望這可以幫助別人。

0

你有測試將批處理文件在Windows窗體exe文件可在同一文件夾? 您是否嘗試過使用管理權限運行Windows窗體應用程序? 只是爲了淘汰權限不足的可能性。

有你也驗證與該代碼被執行,如果該文件夾具有爲用戶上下文權限的用戶上下文?

+0

嘗試使用「以管理員身份運行」選項運行winforms應用程序,但問題仍然存在。這兩個應用程序具有完全相同的權限,即我試着正常運行控制檯應用程序並使用管理權限,並且按預期工作,而Winforms應用程序無論是正常運行還是具有管理權限都無法複製所需文件。批處理文件,控制檯exe和winforms exe都在同一個文件夾中。 – raluru

+0

嗨,歡迎來到stackoverflow,這將是一個評論,而不是一個答案。 – Dzyann

相關問題