【Management】 “Invoke-Command -AdJob” と “Invoke-Command {Start-Job}” の違い、説明できますか?

多くの方が Windows PowerShell をお使いのことと思います。 PowerShell にはさまざまな「奥義」が存在しますが、「バックグラウンドジョブ」も奥義の一つです。これは究極奥義である「ワークフロージョブ」へとつながる大切な概念です。 まずは以下をご覧ください。 Get-Service  -ComputerName  Server01 何をやっているかは一目瞭然ですよね。 リモートコンピューター Server01 上のサービス一覧を取得しています。 通常 Get-Service は直ぐに結果を得られるので問題ないのですが、結果取得までに10分とか20分を要する場合にはコンソールを占有されてしまうことを回避するため、「バックグラウンドジョブ」と呼ばれる方法を使用します。 つまり、コマンドを投げっぱなしにしておいて(非同期実行)、あとから結果を取りに行く…という方法です。 バックグラウンドジョブを作成するには2つの方法があります。 -AsJob パラメタを使用する Start-Job コマンドレットを使用する いずれを使用しても得られる結果は同じですが、コマンドレットによっては -AsJob をサポートしていない場合もあり、その場合には Start-Job の引数にコマンドレットを指定します。 例えば、Get-Service の場合には -AsJob パラメタをサポートしていないため、バックグラウンドジョブ化するには以下のように書きます。 Start-Job -ScriptBlock { Get-Service -ComputerName  Server01 } さて、ここまでは一般ピープルでも知っていることです。 エキスパートな方はここからが重要なのです。 さっそくですが、以下の2つの違いわかりますか?いずれも上の記述を書き換えたもので、同じ結果が得られます。 $S = New-PSSession  -ComputerName  Server01 Invoke-Command  -Session $S  -ScriptBlock { Get-Service }  -AsJob…

0

【Management】Get-Content -tail って知ってました?

Linux/UNIX 系の方にはおなじみの Tail コマンドですが、これと同じことを Windows でできないものかとよく尋ねられます。 MVP のあおきさんが書かれているように、CodePlex で LogExpert というツールが公開されていますので、すでにこちらをお使いの方も多いことでしょう。 http://d.hatena.ne.jp/aoki1210/20120218/p1 ※この記事の存在は石坂さんから教えていただきました。石坂さん、ありがとうございます!そしてあおきさん、ありがとうございます! では、本当に Windows 標準ではできないのかといえば、実はそんなことはありません。 Windows PowerShell に用意されている Get-Content コマンドレットを使用すれば同じような処理が可能です。 例えば以下のように書きます。 Get-Content   .\FinaName.log  -wait  -tail  0 -wait は新しい行が追加されるまで待ち合せることを意味しています。 注意していただきたいのは、その後の -tail です。このパラメタは Windows PowerShell 3.0 からサポートされたものです。 以前は  Get-Content   .\FinaName.log  -wait などとやると、テキストファイルをいったん全部読み込んでから -wait 処理が始まるため、巨大なファイルを扱う場合には待ち時間が異常に長いという問題がありました。 しかし、-tail パラメタのサポートにより、「最後の○行だけ読み込む」という指定ができるようになったのです。もちろん、 -tail  0  は「0行読み込む」という意味なので、何も読み込まずにいきなり -wait 処理が始まります。 試しに、何か巨大なテキストファイルを用意してみてください。 手元にない方は、郵便局が用意している郵便番号データ(CSV ファイル)なんかがよいかもしれません。 http://www.post.japanpost.jp/zipcode/dl/oogaki.html 巨大な…

0

【so what】 OpenWith って知ってます?

Windows 8 のコマンド系小ネタ その2です。 たぶん、99%の方が「ふーん、で?」と反応されると思いますが、微妙に楽しいコマンドなのでご紹介します。 例えば、readme.txt ファイルをダブルクリックすると通常はメモ帳が開きます。 メモ帳以外のアプリケーションで開きたい場合には、ファイルを右クリックしてコンテキストメニューから「プログラムから開く」を選択します。誰でも知っています。 では、バッチファイルの中からテキストファイルを開きたい場合を考えてみます。 通常は単純に以下のように書けばOKです。自動的に対応ずけられているアプリケーションで readme.txt が開きます。 readme.txt もしアプリケーションを指定したいのであれば、以下のように書くこともできます。 "%ProgramFiles%\Windows NT\Accessories\wordpad.exe" readme.txt では、開きたいアプリケーションをユーザーに選ばせたい場合にはどうしたらよいでしょう?(そんなニーズがどれほどあるかはアレですが) なんと、OpenWith.exe というコマンドが用意されています。 コマンドプロンプトから以下のように入力してみてください。 openwith readme.txt すると、以下のようにアプリケーション選択用のメニューが表示されます。 利用者は、このメニューから好きなアプリケーションを選択することができます。 とっても便利な機能のような気がするのですが、実は広い用途で使えるコマンドではないです。 でも知ってると、ちょっと自慢できます。

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

【PowerShell】特定のプロセス起動を監視したいですか?~Register-WMIEvent コマンドレット

ぜんぜん話は違うのですが、日本の SQL Server サポートチームの Blog が気合入っています(笑)。今後ともご贔屓にしてくださいませ。評判が悪かったら元に戻すと言っていたので、4月には元に戻っている可能性があります。 さて、かなり前のことになりますが、以下の資料を SlideShare に投稿しました。このスライドでは、VBScript を使用して、WMI のイベントをリアルタイムに収集するスクリプトについて解説しています。 このスライドで解説している手法を使用すると、システム内に発生したさまざまなイベントを待ち合わせて、その次のアクションを自動的に実行することができます。 例えば、次のような処理が簡単に自作できます。 監査ログを監視して、ユーザーが作成されことを検出したらホームディレクトリを自動的に作成する 特定のサービスを監視して、停止したらメールする 特定の誰かがログオンしたらメッセージを表示する 特定のプログラムが起動したら強制的にKILLする などなど。 ※上記スライドには MOF を使用してスクリプトをサービス化する手法についても書かれています 【PowerShell 1.0 の場合】 これと同じことが PowerShell でできないだろうか….と思いつつすっかり忘れていましたが、実は初期の PowerShell の頃から同じことは実現可能でした。 (参考)Windows PowerShell 2.0 – WMI Event Monitoring 上記の参考リンクでは、以下の様なスクリプトを紹介しています(ちょっとだけ変えています)。このスクリプトでは、WMI の __InstanceCreationEvent というイベント監視用クラスを使用し、Win32_Process を監視しています。クラス名に「Creation」という言葉が入っている通り、「何らかのプロセスが起動したらコンソールにプロセス名を表示する」という動作をします。 $a = 0 $timespan = New-Object System.TimeSpan(0, 0, 1) $scope = New-Object System.Management.ManagementScope("\\.\root\cimV2") $query…

7

【PowerShell】sendkeys で日本語を送りたい

以前、こんな投稿をしました。 【PowerShell】WEB ページをアーカイブする この投稿の中では、PowerShell を使用して WEBサイトを MHT ファイルに保存する方法について書いたわけですが、ある方から質問をいただきました。 「ファイル名を日本語で入力するにはどうしたらよいか?」 なんとするどい質問でしょう。 そうなんです。vbs 使いには昔から有名な話ですが、sendkeys メソッドって日本語が正しく送れないのです。 例えば以下のようなスクリプトを実行したとします。これは、$url を mht 形式で保存するスクリプトなのですが、「Web ページの保存」ダイアログに対して Sendkeys メソッドでキーシーケンスを送っています。 $url = "http://www.microsoft.com/" $title = "abcdefg1234 マイクロソフト 安納 順一" $code = ‘$WShell = New-Object -comobject WScript.Shell; ‘ $code = $code + ‘$WShell.AppActivate(”Web ページの保存”, $true); ‘ $code = $code + ‘$WShell.SendKeys(”%T”) ; ‘ $code = $code…

0

【PowerShell】(更新)PowerShell から Facebook にアクセスしてみる~Facebook PowerShell Module

2011.8.25 Facebook PowerShell Module のバージョンアップに伴いリライトしました CodePlex に以下の SDK とモジュールが公開されています。 Facebook C# SDK(5.0.50) Facebook PowerShell Module(Alpha 0.2 0.3.3)※Alphaですよ!みなさん 後者を見てざわざわしたものを感じた方は、完全に PowerShell にやられていると言って過言ではないでしょう。 理屈は追って説明することにして、まずは使ってみましょう。 以下をクリックして、Facebook PowerShell Module をダウンロードしてください。SDK はひとまず必要ありません。 ←クリックしてダウンロード ダウンロードしたファイルは ZIP形式になっているので、適当な場所(c:\tmp 等)に解凍したファイルを保存しましょう。 含まれているファイルは以下の通りです。 Facebook.dll Facebook.pdb Facebook.ps1 Facebook.psd1 Facebook.psm1 Facebook.xml FacebookExamples.ps1 FacebookPSModule Alpha 0.3.3.msi ← インストーラー Microsoft.Contracts.dll インストールは簡単です。 上記の FacebookPSModule Alpha 0.3.3.msi を実行するだけです。 インストールが完了すると、以下のように、プロファイル内に Facebook というフォルダが作成され、必要なファイルがコピーされます。 C:\Users\<ユーザー名>\Documents\WindowsPowerShell\Modules\Facebook さて、ここまでできたらいよいよ触ってみましょう。…

2

【PowerShell】依存関係チェッカーに学ぶ、必須ソフトウェアのチェック方法

前回の投稿では、Identity Developer Training Kit で発生する、日本語環境でのエラー回避方法について紹介しました。 【WP7 for IT Pro】Identity Developer Training Kit の前提条件チェックが通らないときの対処 エラー回避のキーとなるのは、Windows PowerShell スクリプトでした。 で、依存関係チェッカーが使用しているスクリプトを改めて眺めてみると、コレが結構勉強になる代物でして。簡単なスクリプトなんですけどね。 Identity Developer Training Kit で用意されている前提条件チェック用スクリプトは以下の通りです。ファイル名を見れば何をチェックしているか、一目瞭然ですよね。 PS C:\IdentityTrainingKitVS2010\Assets\DependencyChecker\scripts\dependencies\check> dir |ft name Name —- CheckASPNET4.ps1 CheckAzureMMC.ps1 CheckAzureTools13ForVS2010.ps1 CheckAzureTools14ForVS2010.ps1 CheckAzureToolsForVS2008.ps1 CheckAzureToolsForVS2010.ps1 CheckIIS7.ps1 CheckIis7AspNet.ps1 CheckIisRewrite.ps1 CheckIISStaticContent.ps1 CheckLoadUserProfile.ps1 CheckNET35SP1.ps1 CheckNET4.ps1 CheckNetServicesSDK.ps1 CheckSilverlight4ToolsForVS.ps1 CheckSilverlightDevTools.ps1 CheckSilverlightToolsForVS.ps1 CheckSqlServer.ps1 CheckSqlServer2008.ps1 CheckVistaSP2.ps1 CheckVS2008.ps1 CheckVS2010.ps1 CheckWCFHTTPAct.ps1 CheckWifRuntime.ps1 CheckWifSdk4.ps1 CheckWP7AddInVS2010.ps1…

0