2016-10-14 11 views
1

C#コアアプリケーションから ".sh"ファイルを実行しようとしていますが、正しく実行されていないようです。シェルスクリプトファイル(.sh)がLinuxのC#コアから実行されない

私はLinux環境でホストされている.Netコアプロジェクトに取り組んでいます。私たちは "Apache FOP"を使ったプロジェクトで "PDF"を作成しようとしています。 私は内部的に "fop"を必要なパラメータで呼び出す1つの "シェルスクリプト"ファイル "transform.sh"を作成しました。開発はWindowsマシン上で行われているので、同じusinf "バッチ"ファイルすなわち "transform.bat"我々は、Linux環境の「バッチ」ファイルを使用することはできませんので、私たちは、シェルスクリプトファイル「transform.sh」

後は、以下の「transform.sh」

./fop -xml $1 -xsl $2 -pdf $3 

からのコードでC#コードからされて作成されました"シェルスクリプトファイル"と呼んでいます。

var process = new Process 
         { 
          StartInfo = new ProcessStartInfo 
          { 
           UseShellExecute = false, 
           RedirectStandardOutput = true, 
           Arguments = string.Format("{0} {1} {2}", XML_filename, XSL_filename, output)         
          } 
         }; 

    process.StartInfo.FileName = "Path to shell script file"; 
    process.Start(); 
    process.WaitForExit(); 

上記のコードではエラーはありませんが、pdfファイルは作成されません。「Terminal」からシェルスクリプトファイルを直接実行すると、正常に動作し、pdfファイルが作成されます。

./transform.sh "/home/ubuntu/psa//PdfGeneration/ApacheFolder/XMLFolder/test.xml" "/home/ubuntu/psa/PdfGeneration/ApacheFolder/XSLTFolder/Certificate.xsl" "/home/ubuntu/psa/PdfGeneration/ApacheFolder/PDFFolder/t444t.pdf" 

私は間違って何かがある場合、私はsheelスクリプトはC#のコアアプリケーションを介してLinux上で実行することができますどのように?やって教えてください。おかげさまで

+0

があなたに送信された引数にスペースはあります(変更FOPファイルのフルパスを与えること)でしたbashスクリプト?どちらの方法でも、引数の文字列は実際には各引数の周りに引用符を付ける必要があります。 [二重引用符をエスケープするための最後の例をここで確認してください](https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.arguments(v = vs.110).aspx?cs-save- lang = 1&cs-lang = csharp#code-snippet-2)。 bashスクリプトはまったく実行されますか?スクリプト内で 'touch \ some \ file'を実行して、実行しているかどうかを確認することもできます。 – JNevill

+0

はい各引数の間にスペースがあります –

+0

引数内のスペースを意味します。 '/ home/ubuntu/my folder/myfile.xml'と似ています。linuxのシェルスクリプトに引数を渡すときは、これらの引数を引用符で囲み、複数の引数に分割しないようにすることが重要です。おそらく、スクリプトから何が出てくるのかを見るには、スクリプトを 'echo $ 1" "$ 2" "$ 3">/home/ubuntu/scripttest.txtに変更してください。その後、スクリプトを実行するプログラムを実行し、そのファイルに何が蹴られているかを確認します。 – JNevill

答えて

2

私は質問で述べたようにちょうど私が通過PDFファイルを生成することができませんでした

...それは将来的に他の人を助けることができるように私はここに私の解決策を置くべきであると考え、問題を解決することができました"@JNevill"で示唆されるようにデバッグした後、シェルスクリプトファイルが.netプロセス自体から呼び出されていないことがわかりました。

私の最初の仕事は、.Netプロセスを通して呼び出されるシェルスクリプトファイルを作ることでした。 ネットで検索し、さまざまなソリューションを試した後、私は How to perform command in terminal using C#(Mono)に解決策を得ました。

だから、次のようにプロセスを呼び出すの私のコードを変更し
var command = "sh"; 
var myBatchFile = //Path to shell script file 
var argss = $"{myBatchFile} {xmlPath} {xsltPath} {pdfPath}"; //this would become "/home/ubuntu/psa/PdfGeneration/ApacheFolder/ApacheFOP/transform.sh /home/ubuntu/psa/PdfGeneration/ApacheFolder/XMLFolder/test.xml /home/ubuntu/psa/PdfGeneration/ApacheFolder/XSLTFolder/Certificate.xsl /home/ubuntu/psa/PdfGeneration/ApacheFolder/PDFFolder/test.pdf" 

var processInfo = new ProcessStartInfo(); 
processInfo.UseShellExecute = false; 
processInfo.FileName = command; // 'sh' for bash 
processInfo.Arguments = argss; // The Script name 

process = Process.Start(processInfo); // Start that process. 
var outPut = process.StandardOutput.ReadToEnd(); 
process.WaitForExit(); 

コードを変更した後、「.SH」ファイルを実行してしまったと私は、PDFファイルを生成することができました。

また、Apache FOPファイル(「FOP.sh」)を呼び出す「.sh」ファイル(つまりtransform.sh)のスクリプトも変更する必要があります。

は、最初のコードでは、私は以下のように変更

./fop -xml $1 -xsl $2 -pdf $3 

は、

/home/ubuntu/psa/PdfGeneration/ApacheFolder/ApacheFOP/fop -xml $1 -xsl $2 -pdf $3 
関連する問題