◆パラメータとパイプライン両方の入力に対応した関数を作るPowershellのコマンドレットだとパイプライン入力と-InputObject引数に対応した物がよくある。同様のものを関数で作ってみる。パイプライン入力の時にParamでパラメータを受け取るためには、[Parameter(ValueFromPipeline=$True)]属性を指定してやれば良さそうだ。入力が配列の場合、パイプライン入力はProcessブロックで個々の処理が可能だが、パラメータ入力の場合は自分でループしてあげる必要がありそうだ。いうわけでサンプルとしてつくってみたのが以下だ。ftestなんとなく結果は良さそうだ。-----たまたま昔のこのブログを見る機会があったのだが、これって特に呼ばれるパターンを判定して処理をしなくても良さそう・・・。バージョンによる違いなのか、当時なにか勘違いをしていたのか・・・。以下にサンプルの雛形があるので参考に。◆スリープ(Sleep)解除イベントを拾うPCの世界でも節電が最重要課題だ。スリープ機能を使えば節電出来るのは判っているが、経験上スリープを使うと様々な不具合に見舞われる。メーカー製ノートPC等はハード的に対応が進んでいて問題は出づらいだろうがデスクトップPCになるとまだまだ?特に追加機器を接続していたりすると顕著に地雷を踏む。私もこのご時世なのでスリープ設定をしてみた。Windows7はスリープに入るのも戻るのも非常に素早く快適だ。思っていたのもつかの間、やはり不具合はやってきた。ロジクールマウスにアサインしている機能が効かなくなる。(結構以前からある問題のようだ)しかもどの機能が効かなくなるかはその時々で違う。ん~、日本のために我慢して使うかとも思ったのだが、ここらへんは作業効率にシビアに効いてくる部分なのでかなりストレスが溜まる。調べてみるとSetPoint(ロジクールのマウスウェア)を再起動してやれば直るらしい。それなら、スリープ復帰のイベントを拾って再起動してあげればOKじゃん。いう訳でWMIでそれっぽい物を探す。すると、まさにそれっぽいWin32_PowerManagementEventなんてのがある。ROOT\cimv2Name----Win32_PowerManagementEventCIM_PowerSupplyCIM_UninterruptiblePowerSupplyWin32_PerfFormattedData_PowerMet...Win32_PerfRawData_PowerMeterCoun...ネットでこいつを調べたところEventType=7がスリープ復帰(Resume)イベントらしい。◆プロセスの開始終了を監視する(Register-WmiEvent、Get-Event)でやっているのでこいつを真似してスリープ復帰時にSetPointを再起動するスクリプトが以下である。Unregister-Event}</TBODあとはこれを、スタートアップなりスケジューラなりで実行して上げれば良い。私は、キックする起動ファイルを作りたくなかったのでタスクスケジューラに登録した。引数は以下のように指定してみた。◆文字列で抽出するFilterを作る今日ネットを眺めていて以下のようなFilterを見つけた。便利そうであるが、背景を理解せずに無闇につかうのもどうかと思うので、個人的な解説を述べる。(あくまでも個人的な)本来Powershellではパイプラインで渡すのは、これまでのように文字列ではなくオブジェクトだよっていうのが一番の売りなので無闇に文字列にして処理するのはナンセンス。Ser...とやるのが普通。それでもプロパティ名を調べるのが面倒とか、もともと文字列でしか結果が帰ってこないコマンドもあるので一律文字列で検索るような上記Filterは有効とは思う。文字列を検索するならSelet-Stringという専用のコマンドレットの使用も検討したほうが良いだろう。以下はByPropertyNameなパラメータを文字列で検索している。値は入力したとおりに使用さ字はありません。パスにエスケープ文字が含まれている場合は、単一引用符で囲みます。単一引用符で囲んだシーケンスとして解釈されません。ワイルドカードを使用できます。ByPropertyName)ByPropertyNameを含んだ行だけを表示しても何のパラメータか判らないので、該当行の前7行を一緒に表示させている。「>」付きで表示されている行が実際にヒットした行である。当初のFilterをContext機能付きに書き換えてみた。◆ファイルのパスに使える文字かを調べるファイルのパスに使えない文字はSystem.IO.PathクラスのGetInvalidPathCharsメソッドで取得することが出来る。特殊な文字がたくさんあるので[Regex]::Escapeでエスケープしてから正規表現で一致するか調べればOKだろう。◆Powershellのデバッグ機能タイプミス等によるバグを見つけるときにPowershellのデバッグ機能を使うと簡単に見つかる。–Strictとやっておけば、値の設定されていない変数参照をエラーにしてくれる。Set-StrictModeコマンドレットを使うともう少しきめ細かくエラーチェックが出来る。2.0※以下はヘルプから説明の抜粋。オブジェクトに存在しないプロパティへの参照を禁止します。メソッドを呼び出すための構文を使用した関数の呼び出しを禁止します。同等のチェックを行ってくれる。こんな便利な機能なら最初から指定しておけよ、っと思うかもしれないが、スクリプトによっては存在しないプロパティを参照しても無視してくれることでコーディングが簡便になる場合もあるので、必要に応じて使い分けるのがベターだろう。サーバー管理ツールをインストールし、以下からActiveDirectoryモジュールを有効にする。後はImport-ModuleでActiveDirectoryモジュールを読みこめばサーバー上と同様な管理作業が出来るようになる。ActiveDirectory◆Zipファイル(圧縮ファイル)を作る(改)ちょっと修正と補足。17行目はIO.PathクラスのChangeExtensionメソッドを使ったほうがスマートっぽい。"D:\test\sample.txt"#>param([parameter(Mandatory=$true,HelpMessage="圧縮したいファイル(フォルダ)のパスを指定してください。18))は雰囲気で判るとは思うが、Asciiコードがゼロのキャラクター(文字)を18個つなげるって事。◆CSVファイルを使ってActiveDirectoryユーザーを追加するCSVファイルを読んでNew-ADUserコマンドレットにパイプすれば簡単に出来る、っと思ったのだが、色々とつまずいた。1件ごとに追加するときにはNameパラメータを指定するだけで良かったのだがCSVから追加するときにはSamAccountNameパラメータも指定する必要があるようだ。(タイミング的な問題が絡んでいそうな・・・)また、EnabledパラメータやPasswordNotRequiredパラメータのboolパラメータの指定が効いてくれない。ByPropertyNameパラメータなので普通に指定できるはずと思うのだが。指定の仕方が悪いのか・・・。仕方が無いのでSet-ADUserで追加設定することにした。$true11行目迄はCSVファイルを作っているだけなので別の方法でCSVを手作りする場合には特に関係ないので読み飛ばして構わない。◆ActiveDirectoryユーザーを追加する(New-ADUser)GUIでユーザーを追加するときは仮の初期パスワードを付けていたのだが(そうしないと怒られるので)以下のようにすると初期パスワード無しでも行けるようだ。情報発信ブログにActiveDirectoryのパラメータを解説した便利な画像があったのでリンクしておく。ActiveDirectory◆ボリュームラベルを設定するこんな感じで良いのかな・・・。(Get-ADUser)-filterパラメータに*を指定すると全ユーザーを表示してくれるようだ。*とやると全てのメンバーが表示できそうだ。Mailアドレスに指定のあるユーザーを全て表示する。testmail@hoge.co.jpといった感じになる。ヘルプを見れば普通の事は出来るのではなかろうか。◆イベントログを取得(抽出)する(Get-WinEvent)イベントログを取得するにはGet-WinEventコマンドレットを使えば良い。取ってきたログを抽出するのも普通にやれば問題ないのだが、全部取ってきてからでは時間が掛かる。そんな時は、ログを取ってくる時点でFilterして上げれば良い。FilterHashtableオプションを使うのが簡単そうだ。サンプルとして過去数カ月の発生頻度の高いエラーや警告をサマリーして抽出するスクリプトを作ってみた。}}結果はこんな感じになる。指定できる抽出条件は以下のような感じ。Get-WinEventコマンドレットはコンピューター名も指定できるようなので、ドメイン管理者とかであれば、複数サーバーを巡回させてSystemCenter的な使い方もできそうだ。◆ローカルユーザーグループのメンバー一覧を表示するローカルユーザーグループを取得し、それぞれのグループのメンバーを一覧表示する。◆終了コードを取得する終了コードについては自動変数である$lastexitcodeを参照すれば良い。自己紹介minminnana地方でSE(プログラマ)をやって20年。気づけばいつの間にやら窓際人生。このまま余生を過ごすには若干心残りな2児と2匹(ウサギ、犬)の父。SEと言っても窓際なのでブログやWEBなどにはめっぽう疎い・・・。独学で.NET系を弄ってみるがCOBOLプログラマーにはだいぶ敷居が高い。