現在、Web サービスで powershell スクリプトを実行しようとしています。このスクリプトは、ドライブを別のシステムの共有フォルダーにマップし、フォルダーをそこにコピーします。私が現在抱えている奇妙な問題は、スクリプトが正常に実行されているように見えることですが、スクリプトが実行されているジョブは正しく終了していないようです。したがって、タスクを強制的に終了するにはタイムアウトを設定する必要があります。そうしないと、まったく終了しません。ただし、スクリプトが予想よりも長くかかる場合など、いくつかの厄介な副作用が発生する可能性があるため、これは実際には私が望んでいるものではありません。一方で、特定のシナリオでできるだけ速く実行したいので、スクリプトが「自然に」終了するようにします。
これが私の現在の設定です
C# Web サービスは、次のように powershell スクリプトを呼び出します。
public Collection<PSObject> executeCommand(String pCommand, String pName)
{
// Call the script
var runspaceConfiguration = RunspaceConfiguration.Create();
var runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
var pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(pCommand);
pipeline.Commands.AddScript("Wait-Job -Name " + pName + " -Timeout 60");
pipeline.Commands.AddScript("Receive-Job -Name " + pName);
return pipeline.Invoke();
}
String shareArguments = "some stuff here";
String shareCommandName = "copyFolder";
String shareCommand = "Start-Job -filepath " + currentDirectory + "\\scripts\\copyFolder.ps1 -ArgumentList " + shareArguments + " -Name " + shareCommandName + " -RunAs32";
Collection<PSObject> results1 = executeCommand(shareCommand, shareCommandName);
StreamWriter sharestream = new StreamWriter("D:\\shareoutput.txt");
foreach (PSObject obj in results1)
{
sharestream.WriteLine(obj.ToString());
}
sharestream.Close();
スクリプト自体:
param($sharepath,$shareuser,$sharepassword,$hostname,$sourcefolder)
# create a credentials object
$secpasswd = ConvertTo-SecureString $sharepassword -AsPlainText -Force
Write-Output "0"
$cred = New-Object System.Management.Automation.PSCredential ($shareuser, $secpasswd)
Write-Output "1"
# Access the share
New-PSDrive -Name J -PSProvider FileSystem -Root $sharepath -Credential $cred
Write-Output "2"
# Copy the folder including the file
Copy-Item $sourcefolder "J:\" -Recurse -Force
Write-Output "3"
# Unmap drive
Remove-PSDrive -Name J
ジョブのデバッグ出力を取得すると、出力は次のようになります。そのため、 New-PSDrive 呼び出しが何らかの形でここでブロックされているようです。
0
1
これの原因は何ですか?どうすれば修正できますか?
ヒントを事前にありがとう