2016-05-13 50 views
2

我不知道是否有人可以請幫我理解爲什麼我的Process不工作,也不會產生錯誤。c#System.Diagnostics.Process不會做任何事情或拋出錯

下面的代碼應循環遍歷一個目錄,找到擴展名爲sqb的所有文件,並將每個文件運行Process作爲在服務器上具有較高特權的用戶帳戶。

出於示例目的,該過程應該從與文件所在的文件夾相同的文件夾運行可執行文件sqb2mtf.exe,例如sqb2mtf.exe file.sqb file.bak

如果我使用Visual Studio 2013並逐步執行代碼,我可以看到每個文件都被循環並且Process似乎會觸發,但沒有文件被轉換,也沒有任何錯誤提供給變量readToEndError

var directory = new DirectoryInfo(@"D:\inetpub\Import\"); 

foreach (var file in directory .EnumerateFiles("*.sqb")) 
{ 
    var convert = Path.GetFileNameWithoutExtension(file.ToString()); 

    var process = new Process 
    { 
     StartInfo = 
     { 
      CreateNoWindow = true, 
      UseShellExecute = false, 
      RedirectStandardOutput = true, 
      RedirectStandardInput = true, 
      RedirectStandardError = true, 
      FileName = @"D:\inetpub\Import\sqb2mtf.exe", 
      UserName = "myUserName", 
      Domain = "myDomain", 
      Password = GetSecureString("myPassword"), 
      Arguments = @"D:\inetpub\Import\" + file + " " + @"D:\inetpub\Import\" + convert + ".bak" 
     } 
    }; 
    process.Start(); 

    string readToEndOutput = process.StandardOutput.ReadToEnd(); 
    string readToEndError = process.StandardError.ReadToEnd(); 

    process.WaitForExit(); 

} 

我會在我心裏,任何建議來解決這將非常感激:-)

更新

var directoryInfo = new DirectoryInfo(BackupDirectory); 

foreach (var file in directoryInfo.EnumerateFiles("*.sqb")) 
{ 
    var convert = Path.GetFileNameWithoutExtension(file.ToString()); 

    var fileName = BackupDirectory + "sqb2mtf.exe"; 

    var arguments = "\"" + BackupDirectory + file + "\" \"" + BackupDirectory + convert + ".bak\""; 

    var process = new Process 
    { 
     StartInfo = 
     { 
      CreateNoWindow = true, 
      UseShellExecute = true, 
      RedirectStandardOutput = false, 
      RedirectStandardInput = false, 
      RedirectStandardError = false, 
      FileName = fileName, 
      Arguments = arguments 
     } 
    }; 
    process.Start(); 
    process.WaitForExit(); 

    file.Delete(); 
} 

一件事由InBetween從註釋借鑑是引號的需要,在這種情況下,引號需要包圍兩個單獨的文件。

我可以確認此代碼在IISExpress上工作,模擬不同的用戶,不幸的是只是不是IIS 7.5。

工作環境是將此代碼移入控制檯應用程序並安裝在相關服務器上,然後使用Windows計劃任務作爲特定帳戶運行。

+0

完美檢查:當你從'cmd'運行命令時它工作嗎? 'stdout'也是空的?該過程是否返回退出代碼0或其他內容?如果這一切都檢查出好,你必須有'UserName','Domain'或'Password'的東西的一些問題。 –

+0

嘗試設置CreateNoWindow = false,以便您可以看到exe文件運行時會發生什麼。它可能會拋出一個錯誤或消息,你可以看到閃光過去。一旦你有它的工作,那麼你可以隱藏窗口。 –

+0

如果我將CreateNoWindow設置爲false,則不會出現窗口,如果我拼錯用戶名,則會出現錯誤:登錄失敗:未知用戶名或密碼錯誤,因此我會假設是正確還是錯誤,如果我沒有收到此錯誤域名,用戶名和密碼正常工作。 – iggyweb

回答

1

對於一些舊版應用程序,我發現我需要將參數作爲引用文本傳遞,否則它們根本無法工作。

不知道這是否是問題,但它是值得嘗試:

Arguments = "\"D:\\inetpub\\Import\\" + file + " D:\\inetpub\\Import\\" + convert + ".bak\""; 

不過似乎奇怪的是,過程中只會默默地死去。我會仔細檢查Domain,UserNamePassword

+0

謝謝你,我試過用引號把論述包起來,但還是沒有喜樂。如果我拼錯了用戶名或密碼,我會得到一個錯誤信息,但在所有細節都正確的情況下不會。 – iggyweb

+0

我錯過了內部引號,所以'var arguments =「\」「+ BackupDirectory + file +」\「\」「+ BackupDirectory + convert +」。bak \「」;'工作,但只在IISExpress上。 – iggyweb