【PowerShell】長時間バッチ処理中に停電でサーバーがシャットダウン!でも Workflow ならば安心です

Windows PowerShell 3.0 にはワークフロー機能が実装されています。もちろん、そのベースとなっているのは Windows Workflow Foundation 4.0 です。 例えば、以下のようなワークフローがあったとします。このワークフローでは、UserList.csv ファイルにの保存されたユーザー一覧を読みこんで、大量のユーザーを順次作成する処理を想定していると考えてください。 Workflow CreateUser {     Get-Content -Path \\junichia-vdi\tools\ps\wf\UserList.csv -Encoding String | `             Out-File -Path .\UserList_Unicode.csv -Encoding unicode     $UserList = Import-Csv -Path .\UserList_Unicode.csv     foreach  ($u in $UserList)     {         $UserID = $u.userID         Echo -InputObject "$(Get-Date) $UserID を作成します"         $password = convertto-securestring…

0

【PowerShell】PowerShell 3.0 を使用した Windows Server 2012 管理の自動化

2012年6月は、毎週1回、10:00~11:30に Windows PowerShell 3.0 のセミナーを継続的に開催しています。 これまでに、2回開催し、残すところあと2回となりました。 基礎編(終了) リモーティング編(終了) ワークフロー編(6月19日) 開発者編(PowerShell コマンドレットを使って管理アプリを作る)(6月25日) 既に満席となっておりお申込みいただくことはできないのですが、ひとまずワークフロー編までの資料を以下に公開しました。 随時アップデートしていく予定ですので、興味のある方はダウンロードしてお使いください。 Windows PowerShell 3.0 によるWindows Server 2012 管理の自動化 v2.0 2012.06.19 更新版(初級編+リモーティング編+ワークフロー編) View more presentations from Junichi Anno

0

【PowerShell】リモートコンピューターが再起動するまで待ち合わせるには

Windows PowerShell には Restart-Computer という便利なコマンドレットが用意されています。 Restart-Computer –ComputerName TARGETCOMPUTER とすれば、リモートコンピューターを再起動することができます。 もしリモートコンピューターに誰かがログオンしていても、-Force を指定することで強制的に再起動できます。もちろん管理者権限が必須です。 さて、ここで問題です。 リモートコンピューターに対して複雑な処理をしているとき、一度再起動が必要な処理があったとします。 もちろん、再起動後にも処理は継続しなければなりません。 どうしましょう? 例えば、以下のようなスクリプトを作れば、待ち合わせは可能です。 ※ 2012.6.18 14:21 スクリプトに不備があったので修正しました…すみません New-PSSession -ComputerName $ServerName Restart-Computer -ComputerName $ServerName -Force do #セッションが切断されるまで待ち合わせ {     Start-Sleep -Seconds 1 } Until ((Get-PSSession -ComputerName $ServerName).count -eq 0) do #セッションが再接続されるまで待ち合わせ {     Start-Sleep -Seconds 1     $S = New-PSSession -ComputerName $ServerName }…

0

【PowerShell】ループバック PS セッションとは

Windows PowerShell 3.0 では、PowerShell のセッションから一旦切断して、別のコンピューターから再度接続する…ということが可能になっています。 PowerShell Web Accessを使用すれば自宅からの再接続も可能となり、どこからでも仕事がしたいエンジニアにとっては垂涎の機能です。PSWAを経由すればスマートフォンからでも接続できます。すばらしいです。 ここで、こんな疑問が出てきます。 普通はサーバーに「ローカルログオン」して作業しているから、 そこに再接続できるとうれしいんですけど はい、可能です。 それがループバックPSセッションです。 仕組みも使い方も、リモーティングと全く同じです。 PowerShell コンソールを開いたら、以下のようにしてローカルコンピューターに対して PS セッションを開設します。 PS C:\> $Session = New-PSSession PS C:\> Enter-PSSession $Session [LOCALHOST] PS C:\> プロンプトが [LOCALHOST] となったことに注意してください。これで、ローカルコンピューターに PS セッションを経由して入り込んだことになります。 作業が完了したら PowerShell コンソールを閉じる前に以下のコマンドを入力します。 [LOCALHOST] PS C:\> Exit PS C:\> Disconnect-PSSession $Session Id Name            ComputerName    State         ConfigurationName        Availability — —-            ————   …

0

【PowerShell】Invole-Command –FilePath パラメタの魔法

Invoke-Command を使用するとリモートコンピューター上でコマンドレットを実行することができます。このとき、コマンドレット単体ではなく、スクリプトファイル(.ps1)を使用することができます。 Invoke-Command で .ps1 ファイルを使用する方法は2つあります。 Invoke-Command -ComputerName SV01 -FilePath .\hogehoge.ps1 Invoke-Command -ComputerName SV02 {.\hogehoge.ps1} 前者と後者の違い、わかりますか? 前者の場合は、スクリプトファイルのパスはローカルコンピューターです。後者の場合は、リモートコンピューター内のパスになります。 リモートコンピューターにコマンドレットが存在することさえ確認できていれば、スクリプトファイルをいちいち送信しなくてもよいというのは非常に便利なことです。 (参考)【PowerShell】Hyper-V 系コマンドレットを手元の Windows 7 から実行するには ~ Import-PSSession ちなみに、指定した ps1 ファイルに引数を指定したい場合にはどうしたらよいでしょう? 以下のように、-ArgumentList パラメタを使用して指定します。 Invoke-Command -ComputerName SV01 -FilePath .\hogehoge.ps1 -ArgumentList “Arg1",“Arg2",“Arg3" PowerShell…知れば知るほど奥が深いです。

0

【PowerShell】-ComputerName に複数のリモートコンピューターを指定するとどうなる?

Windows PowerShell のコマンドレットには、-ComputerName というパラメタを持つものが多く存在します。 これは、WMIを使用してリモートコンピューターのクラスに接続して、情報を取得したり処理を行うためのものです。 -ComputerName には以下のようにして複数のコンピューターを指定することができます。 Get-Service -ComputerName tfdc01,tfsv01 |Select-Object name,machinename Name                                                 MachineName —-                                                 ———– adfssrv                                              tfsv01 AdtAgent                                             tfdc01 AdtAgent                                             tfsv01 ADWS                                                 tfdc01 AeLookupSvc                                          tfsv01 AeLookupSvc                                          tfdc01 ・ ・ ・ 結果は、キーとなる Name の昇順で表示されていることがわかります。 もしコンピューターごとにまとめて出力するのであれば、以下のように指定すればOkです。  Get-Service -ComputerName tfdc01,tfsv01 |Sort-Object MachineName |Select-Object MachineName,Name,Status さて、ここで疑問です。 複数のコンピューター名を指定した場合、処理はパラレルで行われるのでしょうか?それとも ForEach のように順番に処理されるのでしょうか? ためしに複数のコンピューターに対して以下のコマンドレットを実行してみます。これはリモートコンピューターに接続して3秒後に現在の日時をミリ秒まで取得し表示しています。 $List = "tfsv01","tfsv02","tfsv03","tfdc01","tfdc02","tfops","tfsql2" Invoke-Command -ComputerName $List {Start-Sleep -Seconds…

0

【PowerShell】PSComputerName プロパティの存在を忘れずに

Windows PowerShell を使用してリモートコンピューターに対して処理を行うには、-ComputerName パラメタを使用するのが一般的です。 例えば、リモートコンピューターのサービス一覧を取得するには、以下のように入力します。 Get-Service –ComputerName Target01 結果は以下の通りです。 Status   Name               DisplayName ——   —-               ———– Stopped  AeLookupSvc        Application Experience Stopped  ALG                Application Layer Gateway Service Running  AppHostSvc         Application Host Helper Service Running  AppIDSvc           Application Identity ・ ・ ・ 出力結果にコンピューター名を含めたい場合には、以下のように書きます。 Get-Service –ComputerName Target01 | Select-Object MachineName,Name,Status MachineName                Name                                          Status ———–                —-                                          —— Target01                AeLookupSvc                                  Stopped Target01               …

0

Microsoft Virtual Academy ポイント加算キャンペーン

すっかりBLOG投稿をさぼってしまっていまして、すみません。 そろそろ落ち着くので、再開いたします。もう書きたいことがたまりまくっていて、どこから手を付けたらよいやら…. さて、既に6400名に登録いただいている Microsoft Virtual Academy ですが、お得なポイント加算キャンペーンを開催しております。 以下のキャンペーンコードを、Microsoft Virtual Academy のサイトにある「キーワードを登録する」から登録していただくと、??ポイントが加算されます。 キャンペーンコード : junichia8945 https://www.microsoftvirtualacademy.com/MyMVA/Dashboard.aspx ちりも積もれば山となる! 6月末までに登録してください!

0