SharePoint コードからプログラムで PowerShell スクリプト ファイル (.ps1) を実行しています。ソースコードは次のとおりです。
using (new Impersonator("username", "domain", "password"))
{
using (RunspaceInvoke invoker = new RunspaceInvoke())
{
invoker.Invoke("Set-ExecutionPolicy Unrestricted");
}
string cmdArg = String.Format(@"C:\Office2Pdf\officetopdf.ps1 {0} {1}",
DOWNLOAD_FILE_PATH, UPLOAD_FILE_PATH);
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.ApartmentState = System.Threading.ApartmentState.STA;
runspace.ThreadOptions = PSThreadOptions.UseCurrentThread;
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(cmdArg);
pipeline.Commands[0].MergeMyResults(
PipelineResultTypes.Error, PipelineResultTypes.Output);
Collection<PSObject> results = pipeline.Invoke();
var error = pipeline.Error.ReadToEnd();
runspace.Close();
if (error.Count >= 1)
{
string errors = "";
foreach (var Error in error)
errors = errors + " " + Error.ToString();
}
}
私がしていることは
- SharePoint ドキュメント ライブラリから ".docx" ファイルをダウンロードする
- 実行可能ファイルを実行して「.docx」を「.pdf」ファイルに変換する PowerShell スクリプトを呼び出す
- 「.pdf」を SharePoint ドキュメント ライブラリにアップロードして戻す
サンプルコードは第2部のものです。コンソール アプリケーションでは完全に機能しますが、SharePoint ソリューション内では機能しません。エラーは「オブジェクトがオブジェクトのインスタンスに設定されていません」でした。しかし、それがどのオブジェクトを参照しているかを知る方法はありません。
SharePoint Word Automation Services を使用することになりました。かなりうまく機能します。みんなありがとう。