問題タブ [powershell-jobs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
powershell - start-job -filename で起動したときにどのスクリプトが実行されているかを知る方法はありますか?
次のコマンドのようなもので PowerShell ジョブを開始しています。
ただし、このスクリプトは、スクリプトの相対位置に基づいて他のコマンドを実行するため、その位置を知る必要があります。プロンプトから直接実行すると、次のような構造が機能します。
ただし、最初の例のようにジョブとして開始した場合、これはまったく機能しません。仕事として始めたとき、どこから走っているかをどのように判断できますか?
powershell - *.ps1 スクリプトは、バックグラウンド ジョブ自体が *.ps1 スクリプトを実行するときに実行できますか?
5 つのスクリプトを一緒にパイプライン処理するスクリプトの 15 のインスタンスを実行したいのですが、これまでのところ、ピクシー ダストが不足しています。この問題を、スレーブ スクリプトを呼び出すマスター スクリプトを使用したテスト ケースにまとめました。スレーブ スクリプトは、次に sub_slave スクリプトを呼び出します (失敗を再現するためにパイプラインは必要ありません)。
master.ps1 が slave.ps1 を呼び出すと、各バックグラウンド ジョブは、slave.ps1 が sub_slave.ps1 を呼び出す時点で無期限にハングします。slave.ps1 の呼び出しを sub_slave.ps1 にコメント アウトすると、master.ps1 が最後まで実行されます。また、slave.ps1 を直接起動すると、sub_slave.ps1 への呼び出しが正常に実行されます。ダブルチェーンを試してみると、問題は扱いにくいようです。これらのスクリプトを任意の深さを超えてデイジーチェーン接続できないというドキュメントは見たことがありませんが、十分に深く読んでいないのではないでしょうか?
簡単なテキスト ファイルにコンテンツを追加することで、スクリプトの進行状況を追跡していることがわかります。
d:\ジョブ\master.ps1
d:\ジョブ\スレーブ.ps1
d:\jobs\sub_slave.ps1 #必要 -version 2.0
何もコメントアウトせずにコードを実行すると、out.txt に次のように表示されます: d:\jobs\out.txt
各別れメッセージの直後のコマンドは sub_slave.ps1 の呼び出しであり、sub_slave.ps1 からのメッセージはまったく表示されないことに注意してください。システムは、3 つの powershell.exe プロセスが永久に正常に実行された状態でハングします。Get-job は、3 つのプロセスがまだ実行中であり、HasMoreData であることを報告します。
私が得た唯一の手がかりは、ハングしたプロセスをクラッシュダンプすると、次のように表示されることです。
おそらく、ある種のパラメーターの問題が発生していますか?sub_slave.ps1 からすべてのパラメーターを削除しても動作は変わらないので、それはちょっと疑問ですが、可能です。私はどんな考えにもオープンです。
powershell - PowerShellバックグラウンドジョブをデバッグするにはどうすればよいですか?
Jason Archerは私の最後の問題を解決するのを手伝ってくれましたが、彼の解決策をテストする際に、私は本当の問題に出くわしました。サーバーはチェーンバックグラウンドジョブを正しく実行しませんが、ラップトップは実行します。
前の問題のスクリプトをラップトップで実行すると、完全に機能します。スクリプトAはスクリプトBをバックグラウンドジョブとして開始し、スクリプトBはそのジョブ内からスクリプトCを呼び出し、すべての出力が受信されます。サーバーでまったく同じスクリプトを実行すると、スクリプトAがスクリプトBを呼び出し、スクリプトBが無期限にハングします。スクリプトBを直接実行すると、サーバーまたはラップトップで完全に実行されます。それは私を殺している背景にある仕事についての何かです。
$ PSVersionTableは、すべてのコンピューターで同じ結果を返しますが、WinXPとWin2003R2では異なるインストーラーを使用する必要があったことは明らかです。
何が行動の違いを引き起こしているのでしょうか?
バックグラウンドジョブで何が起こっているのかをトラブルシューティングする方法はありますか?受信しているコマンドライン(送信されているものをログに記録しましたが、時々物事がドリフトする)、または実際に物事をぶら下げているオブジェクトを確認できれば、役立つかもしれませんが、デバッガーは私をそこに連れて行きません。おそらく、バックグラウンドで実行されているかのようにISE内でジョブを呼び出す方法がありますか?
powershell - Start-Job を呼び出す関数と同じ powershell モジュール内の関数に依存する Start-Job を呼び出すにはどうすればよいですか?
単一のモジュールで、AWS API と対話するためのいくつかの powershell を作成しています。Get-CloudFormation
CloudFormation のステータスを返す1 つの関数を作成しました。別の関数 を作成しました。この関数はDelete-CloudFormation
、delete-CF API リクエストを発行した後、 my を使用して CloudFormation のステータスをポーリングするジョブを開始しようとGet-CloudFormation
します。
私は呼び出しますExport-ModuleMember
(Get-CloudFormation
しかし、そうではありませんDelete-CloudFormation
;それはプライベート関数です)。 Get-CloudFormation
は、モジュール ファイル内で より前に定義されていますDelete-CloudFormation
。
私のStart-Job
呼び出し(内部Delete-CloudFormation
)は次のようになります:
実行するDelete-CloudFormation
と、例外が発生します。
なんで?どうすれば修正できますか?
似ていると思う7152090を見つけましたが、で呼び出すStart-Job
と-InitializationScript { Get-CloudFormation }
ほぼ同じエラーが発生します。
Start-Job を呼び出す-InitializationScript { Import-Module ".\awsutils.psm1" }
と.
、プロファイルのドキュメント ディレクトリになります。変数をGet-Location
の外側にバインドして のStart-Job
ように呼び出しても-InitializationScript { Import-Module "$location\awsutils.psm1" }
。
powershell - Powershell:変数に格納されている関数にパラメーターを渡す
ジョブ内で関数を使用する簡単な実例を取得しようとしています。関数を仕事に使用するスクリプトブロックに渡すことができましたが、関数のパラメーターを取得できないようです。
出力は次のとおりです。
したがって、出力のOUT:x3で証明されているように、関数が呼び出されていますが、関数のパラメーターを取得できる構文が見つかりません。考え?
編集:
以下のShawnの観察と私の応答では、従来の関数を使用すると機能しないように見えるため、関数を変数として使用してみました。それを機能させる方法があれば、関数を変数として渡す必要がないことを嬉しく思います。
multithreading - Powershell: Receive-Job で予期しない結果が発生する
私は、powershell がジョブを処理する方法をよりよく理解しようとしています。
これらの記事の投稿はどちらも大いに役立ちました。
ただし、次のサンプル スクリプトでは、Receive-Job の呼び出し中に予期しない結果が得られます。各行に結果が表示されることを期待していますが、1 行に複数の結果が表示されたり、余分な空白のキャリッジ リターンが表示されることがあります。各ジョブのコンソールからストリーミングされる情報だけを書き出す方法について何か考えはありますか?
出力は...
または時々...
powershell - -path が変数の場合、gci の受信ジョブ結果がありません
これは何も返しません:
しかし、そのように、変数なしでパスパラメーターを提供します...
...その一時フォルダーの内容、この場合は durrr.txt を返します。これは Windows Server 2008R2 SP1 で、Powershell $host.version の出力は次のようになります。
Powershell の v3 を疑って、Windows 7 SP1 デスクトップを v2 から v3 に更新しようとしましたが、問題を再現できませんでした。アップグレードされたデスクトップでは、$host.version の出力が上記と一致するようになりました。
どうしたの?
編集/何が起こっていたのですか?
バストされた仕事は同等のようです
そのため、gci はバックグラウンド ジョブの現在のディレクトリである Documents フォルダーの結果を返しましたが、これはたまたま空でした。
.net - Powershell Receive-Job は DataSet を返すことができますか?
背景情報:
現在、実行に非常に長い時間がかかる複数のデータベースに対して複数の SQL 接続を行うアプリケーションがあります。
Powershell (.NET) は、進行中の各 " SQL-GET " 関数が終了するのを待ってから、次の関数を起動できます。それぞれの「 SQL-GET」関数を独自のバックグラウンド ジョブで同時に起動することにより、このアプリを劇的に高速化できるという印象を受けました。その後、各ジョブが終了したら、各ジョブからデータを取得します。理想的には DataSet システム オブジェクトとして。
問題:
バックグラウンド ジョブからデータを取得するとき、 System.Arrayオブジェクトを取得することしかできません。私が実際に求めているのは、System.DataSetオブジェクトです。これは、アプリ内のすべてのロジックが DataSet オブジェクトに依存しているため必要です。
コード:
これは、SQL 接続を作成し、新しく作成されたデータセット オブジェクトに返された結果を入力するコードの v.simple スライスです。御馳走を働きます。$resultsは DataSet オブジェクトであり、これをうまく操作できます。
そして、これは非常に同じコードが新しいバックグラウンド ジョブの scriptblock パラメータにラップされています。Receive-Job を呼び出したときにのみ、データセットではなく配列が返されます。
どんな助けでも大歓迎です!!!
これまでの研究:
私は古いGoogleをやったことがありますが、私が遭遇したすべての投稿、ブログ、および記事は、仕事の管理とこれに関するすべての機能について非常に深く掘り下げているようです. receive-jobコマンドレットを介してのみ配列を返すのは、powershellの根本的な性質ですか?
return 式に関するスタックの投稿を読みました。私は何かに乗っていると思った。試みた:
return $results.Tables[0]
return ,$results.Tables[0]
return ,$results
すべてが配列を返します。
私はかなり面倒なことに、手動で配列をデータセット オブジェクトに変換し直す人々を見てきました。私の現在のセッションに!:)
繰り返します:
基本的には、$ret_results オブジェクトを Receive-Job コマンドレットから取得して、DataSet にすること、または DataTable にすることだけが必要です。私はどちらかを取ります...配列ではありません:)
powershell - -AsJob を使用して Powershell Invoke-Command をリモートでリモート プログラムを起動できませんでした
長時間実行されるリモート プログラムを起動したいのですが、待ちたくありません。そこで、PS スクリプト ファイルに以下の 1 行のコマンドを入力し、「Powershell -file xxx.ps1」を実行します。
ただし、スクリプトの実行後にリモート プログラムは実行されませんが、上記のコマンドを PS コンソールで対話的に実行すると、リモート プログラムは正常に実行されます。スクリプトが終了すると、プログラムが強制終了されたようです。
どうしてこれなの?
アップデート
スクリプトの最後で 1 秒間スリープすると、リモート アプリは正常に動作します。