0

私は1つのc#コンソールapplnを持っています、それはProcess.Start()メソッドを使用して任意のスクリプトファイルを実行します。スクリプトファイルのパスを指定しProcess1.StartInfo.FileNameます。スクリプトファイルは任意のタイプ(.vbs、ps1など)にすることができます。また、命令を使用して文字列をスクリプトに渡しますp.StartInfo.Arguments。スクリプトファイルが実行されると、文字列をc#アプリケーションに再実行する必要があります。この返された文字列は、を設定することで読み取ることができますがProcess1.StartInfo.RedirectStandardOutput = true、この命令を使用するには、を設定する必要がありますProcess1.StartInfo.UseShellExecute = false。このimを実行すると、「指定された実行可能ファイルは有効なWin32アプリケーションではありません」というエラーが発生します。Process1.StartInfo.UseShellExecute = falseこれは、設定したときに、スクリプトファイルの実行に使用する.exeがアプリにわからないことが原因である可能性があります。

一方、exeパスStartInfo.FileNameとスクリプトファイルパスを指定するとStartInfo.Argument、エラーが発生しません。例:PowerShellスクリプトを実行したいのですが、次のプロパティをP1.StartInfo.FileName = "location of powershell.exe"ととして設定p1.startInfo.Argument =".ps1 script file path"しました。この場合、エラーは発生しません。

問題は、どのタイプのスクリプトを実行するのかを事前に知らないことです。また、異なる異なるm/cでスクリプトファイルを実行するための.exeファイルの場所を見つけることができません。それで、同じ共通のc#applnから異なるタイプのスクリプトファイルを実行し、スクリプトによって返される出力を読み取ることも可能ですか?

これが私のコードです

 using System;
 using System.Collections.Generic;
 using System.Text;
 using System.Diagnostics;
 using System.Collections;
 namespace process_csharp
 {
    class Program
    {
       static void Main(string[] args)
       {
        String path = null;
        //this will read script file path 
        path = Console.ReadLine();

        //this string is passed as argument to script
        string s = "xyz";

        Process p = new Process();          
        p.StartInfo.FileName= path;         
        p.StartInfo.Arguments = s;                     
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;      

        p.Start();
        p.BeginOutputReadLine();
        Console.WriteLine(p.StandardOutput.ReadToEnd());
      }

    }
  }
4

2 に答える 2

2

スクリプトタイプを確認し、独自のエンジンからの出力を読み取ることができます。

    static void Main(string[] args)
    {
        string path = Console.ReadLine();
        string parameter = Console.ReadLine();
        string enginePath;
        switch (Path.GetExtension(path).ToLowerInvariant())
        {
            case ".ps1":
                enginePath = "powershell.exe";
                break;
            case ".vbs":
                enginePath = "cscript.exe";
                break;
            default:
                throw new ApplicationException("Unknown script type");
        }

        string scriptPath = path;
        Process process = new Process();
        process.StartInfo.FileName = enginePath;
        process.StartInfo.Arguments = string.Format("{0} {1}", scriptPath, parameter);
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.Start();
        Console.WriteLine(process.StandardOutput.ReadToEnd());
        Console.ReadKey();
    }
于 2012-06-06T11:09:01.273 に答える
1

代わりにこのコードを試してください:

string path = @"C:\mypsscript.bat";
Process p = new Process();
p.StartInfo.FileName = path;
p.StartInfo.Arguments = "xyz";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
Console.WriteLine(p.StandardOutput.ReadToEnd());
Console.ReadKey();

デバッグのために、次のコードを使用してバッチファイルを作成しました。

echo %1

上記のコードを実行すると、次のようになります。

xyz

だからそれはうまくいくようです。このようなバッチファイルを使用してみて、機能するかどうかを確認してください。機能する場合は、機能していないPowerShellスクリプトとの関連付けである可能性があります。これは、後で修正できます。

于 2012-06-06T09:05:57.870 に答える