ファイル MergeDocuments.ps1 に PowerShell スクリプトを保存しています。Windows PowerShell コマンド プロンプトからスクリプトを実行すると、問題なく動作します。
.\MergeDocuments.ps1 1.docx 2.docx merge.docx
Windows コンソール アプリケーションからスクリプトを呼び出すことも問題なく実行されます。
Asp.Net Web サービスからスクリプトを呼び出そうとしたときに、レジストリ アクセスに関するいくつかの問題に直面しました。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
この問題を解決するために、なりすましを使用し、Network Service アカウントにレジストリ キーへのアクセス許可を与えました。
次に、PowerShell が OpenXmlPowerTools.DocumentSource[] 型のオブジェクトを作成できないという問題に直面したため、スクリプトに以下を追加しました。
Add-Type -Path "C:\Users\Administrator\Documents\WindowsPowerShell\Modules\OpenXmlPowerTools\OpenXmlPowerTools.dll"
Import-Module OpenXmlPowerTools
現在の問題は、「'Merge-OpenXmlDocument' という用語はコマンドレットの名前として認識されていません...」というエラーが表示されることです。
どうすれば解決できますか?
PowerShell スクリプト
Add-Type -Path "C:\Users\Administrator\Documents\WindowsPowerShell\Modules\OpenXmlPowerTools\OpenXmlPowerTools.dll"
Import-Module OpenXmlPowerTools
# The last argument is the path of the merged document
$noOfSourceDocs = ($($args.length) - 1)
# Create an array to hold all the source documents
[OpenXmlPowerTools.DocumentSource[]] $docs = New-Object OpenXmlPowerTools.DocumentSource[] $noOfSourceDocs
for ($i = 0; $i -lt $noOfSourceDocs; $i++)
{
$docs[$i] = New-Object -TypeName OpenXmlPowerTools.DocumentSource -ArgumentList $args[$i]
$docs[$i].KeepSection = 1
}
Merge-OpenXmlDocument -OutputPath $args[-1] -Sources $docs
Web サービス .Net コード
using (new Impersonator(username, domain, password))
{
// create Powershell runspace
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
RunspaceInvoke invoker = new RunspaceInvoke(runspace);
invoker.Invoke("Set-ExecutionPolicy Unrestricted");
// create a pipeline and feed it the script file
Pipeline pipeline = runspace.CreatePipeline();
Command command = new Command(ConfigurationManager.AppSettings["PowerShellScript"]);
foreach (var file in filesToMerge)
{
command.Parameters.Add(null, file);
}
command.Parameters.Add(null, outputFilename);
pipeline.Commands.Add(command);
pipeline.Invoke();
runspace.Close();
}