0

現在、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

これの原因は何ですか?どうすれば修正できますか?

ヒントを事前にありがとう

4

1 に答える 1

0

New-PSDrive に問題があります。まず、PSCredential オブジェクトを確認します。次に、スクリプトを更新します

New-PSDrive -Name J -PSProvider FileSystem -Root $sharepath -Credential $cred -Persist

完璧な記事: https://technet.microsoft.com/en-us/library/hh849829.aspx

于 2016-11-02T19:49:39.153 に答える