2016-05-13 5 views
2

なぜ私のProcessが動作していないか、エラーを生成しない理由を理解できるように助けてくれるのだろうかと思います。c#System.Diagnostics.Processが何も実行していない、またはエラーをスローする

以下のコードは、ディレクトリをループし、sqbという拡張子を持つすべてのファイルを検索し、各ファイルに対してサーバー上の特権を持つユーザーアカウントとしてProcessを実行します。

このプロセスでは、たとえば、sqb2mtf.exe file.sqb file.bakなどの引数を持つファイルと同じフォルダから実行可能ファイルsqb2mtf.exeを実行する必要があります。

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でのコメントから上の描画の事引用符の必要性です。この場合は、2つの別々のファイルを囲むために必要な引用符です。

このコードは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\""; 

はまだプロセスは単に黙って死ぬだろうと不思議なようだ:これは問題ですが、それは試してみる価値がある場合

わかりません。私はDomainUserNamePasswordをチェックします。

+0

ありがとう、私は引用符で引数をラップしようとしましたが、まだ喜びはありません。ユーザー名またはパスワードのスペルを間違えた場合、エラーは発生しますが、すべての詳細が正しいとは限りません。 – iggyweb

+0

私は内部引用符を見逃していましたので、 'var arguments =" \ "" + BackupDirectory + file + "\" \ "" + BackupDirectory + convert + "です。bak \ ""; 'は動作しましたが、IISExpressのみで動作します。 – iggyweb

関連する問題