3番目のPowerShellをご覧ください(パートII)

飽くなき指で3番目のPowerShellを感じ続けます。 前回 、イノベーションのレビューを行い、いくつかの追加に触れました: Show-Commandコマンドレットを試し、モジュールの自動読み込みを実行し、簡略化された言語構文を見てセッションファイルを構成し、同時に権限の一部をセッションユーザーに委任しました。

スケジュールされたジョブ

実際、PowerShellタスクは同じWindowsタスクであり、同じ方法でスケジュールに従って実行することも、トリガーが起動されたときに開始したり、他のすべてのタスクと同様に停止または中断したりすることもできます。唯一の違いは、PowerShellから作成され、PowerShellスクリプトを実行するように特別に設計されていることです。
最初にタスクを作成しましょう。たとえば、次のスクリプトの実行で表現しましょう。

 (Get-Date).ToString() + " -  " | Out-File "C:\logfile.txt" -Append for ($i = 3; $i -lt 100; $i++) { $flag = $true for ($j = 2; $j -lt $i; $j++) { if ($i % $j -eq 0) {$flag = $false} } if ($flag) {$i} } (Get-Date).ToString() + " -  " | Out-File "C:\logfile.txt" -Append 

はっきりしていない場合、内部のブロックはエラトステネスの古典的なふるいではありません。スクリプトは3..100の範囲の素数を見つけます。 スクリプトのテキストをファイルC:\ScheduledJob.ps1慎重に保存します。
そして、計画されたタスクを作成します。

 $trigger = New-JobTrigger -Once -at 16:39 $job = Register-ScheduledJob -Name Job -FilePath "C:\ScheduledJob.ps1" -Trigger $trigger 

タスクは、 Task Scheduler Library/Microsoft/Windows/Powershell/ScheduledJobsブランチのTask Scheduler Library/Microsoft/Windows/Powershell/ScheduledJobs



16:39の開始を待って、 logfile.txt行がlogfile.txt
24.06.2012 16:39:03 -
24.06.2012 16:39:04 -
そして今、最も興味深い-これは何のためですか? 結局、この方法でタスクをサドルすることが可能でした:少なくともスクリプトではなく、少なくとも何でも。 しかし、PowerShellプログラムが素数を示したことを覚えていますか? 別のPowerShellウィンドウを起動して実行します。

 Import-Module PSScheduledJob Get-Job Receive-Job -Name Job 

そのような写真が得られます。



タスクが完了し、何らかの結果が得られ、この結果はPowerShellビンに正常に保存されました。次に、目的のためにこれらのビンからこの結果を抽出するだけで、実行と抽出の間隔で再開でき、他のタスクを実行でき、結果は消えません。 エラーを含むタスクの進行状況を追跡できるため、これは実際には小さなことです。たとえば、エラトステネスのふるいを1/0行に置き換えることができ、 Receive-Job後に、赤いフォントで書かAttempted to divide by zeroが表示Attempted to divide by zero目を喜ばせざるを得ない。 最後に、言及したPowerShellビンがある場所のアドレスを共有します: %userprofile%\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobsには、一連のフォルダー、xmlファイル、および入力パラメーターと出力パラメーターを持つ識別子があります。

堅牢なセッション

私が理解しているように、このアイデアはリモートデスクトップサービスから得たものです。確立されたリモートセッションは、接続が失われてもしばらく保持され、その場合は別のマシンから復元できます。 これがどのように行われるかを見てみましょう、 w2012cl1ます:

 New-PSSession -ComputerName w2012dc1 -Name RobustSession Enter-PSSession -Name RobustSession $x="abcdef123" 

したがって、セッションに入り、変数$xabcdef123設定します。この変数を使用して、セッションかどうか、セッションデータが失われているかどうかを確認します。
次に、仮想マシンのネットワークカードの設定で「ああ!」を実行します。



そして、再接続を試みる4分間のPowerShell:



マップ設定で接続を返すと、PowerShellセッションが復元されます。



これがすべてのトリックではありません。ここで、あるマシンで作成されたセッションを別のマシンからインターセプトします。 w2012cl1 、アクションw2012cl1実行します。

 $icptsess = New-PSSession -ComputerName w2012dc1 -Name InterceptedSession Invoke-Command -Session $icptsess -ScriptBlock {$x="abcdef123"} #    Disconnect-PSSession -Name InterceptedSession 



セッションが切断状態になったという事実に注意を喚起し、別のマシンw2012dc1から参加できるようになりw2012dc1 (はい、ここではセッションが同じマシン上にあるため、実験があまりきれいではないことがわかりますが、コマンドを使用します削除されたかのように):

 $icptsess = Connect-PSSession -ComputerName w2012dc1 -Name InterceptedSession Invoke-Command -Session $icptsess -ScriptBlock {$x} 



そして、別のマシンのセッション内に変数を保存します。 Invoke-Commandコマンドレットに注意してください。セッション内でスクリプトブロックを送信するためだけに使用しましたが、理論的にはEnter-PSSessionを使用Enter-PSSessionてセッションに入り、最初の例とまったく同じようにセッション内の値に変数を割り当てることができます。

私はすべてを2つの部分に収めたかったのですが、PowerShellの革新の次のトピックである「ワークフロー」または「ワークフロー」はそれ自体が非常に膨大であることが判明したため、新しいPowerShell ISEシェルとともに第3部で個別に説明します。 ボーナスとして、この場合、以前に発表されていないもの、つまりWeb経由でのPowerShellへのアクセスを追加します。ブラウザーにコマンドを直接入力する方法を示します。

Source: https://habr.com/ru/post/J146422/


All Articles