◆纏めてnslookupホスト名をテキストファイルにいれておき、nslookupを纏めて実行する。nslookup結果。無効にできませんでした。"}}有効にする時はEnableメソッドで。汎用的に作るならNetConnectionIDの存在チェックもしたほうが良いかも。◆Compare-Objectは難しい?で思い通りの出力結果にならず思い悩んだが、S.K.さんからコメントを頂き、問題の本質が見えてきた。◆コンソール出力のオブジェクトマージ機能を回避するで書いたのと同様の問題のようだ。以下のようにOut-Hostを追加することで期待通りの結果が得られた。Out-Host出力オブジェクトが同じ型の時にマージされるのが本当だと思うのだが、diffの結果として出力されるPSCustomObjectはそれ以降の出力オブジェクトをすべて巻き込んでしまう。PSCunsomObjet以降の出力はすべて同じ型であると判定されているようだ。試しに同じPSCunsomObjetを出力するImport-CSVコマンドレットを使って以下のように書いてみた。結果は先頭にCSVの内容を表示した後、空白行が続く。期待通りの結果になる。先頭にPSCustomObjectが来るとダメっぽい。これが仕様だとすると、嵌ること請け合いの仕様だ。思い通りに出力されないときは「Out-Host」と覚えておこうっと。◆文字コードを表示するもう少しスマートな方法があるかもしれないが、とりあえずこんな感じで表示できた。文字コードはUNICODE。ConvertChar2Code("今日は犬と散歩に行きました")結果。◆スコープを書いた時には気付いていなかった方法があったので書いておく。$aこんな風に書いたときC#などの感覚でいえば、$aはメンバー変数なので結果は1,2,3となっていくはずだ。Powershellの場合は以下のようになる。これでは使いづらいので、functionにするのをためらいがちだった。今日、偶然色々と試しているうちに良い方法を見つけた。ドットソースで呼んであげるだけで期待通りの結果になるのである。◆オブジェクトにプロパティを追加する(Add-Member)でも使用した集計プロパティ。説明せずに使っていたので今一度その使い方を確認してみる。集計プロパティはSelect-Objectだけで使えるものではないが、いちばん基本的なコマンドレットであるSelect-Objectを例に説明する。test2.txtこんな感じでプロパティを射影するのが基本的な使い方。SQLと同じイメージ。ここで出力フォーマットを弄ってみる。test2.txtです本来プロパティ名を指定するところに式を指定するのでスクリプトブロックで指定する。スクリプトブロックの中ではパイプラインオブジェクトが$_変数で参照できる。これではタイトルがいただけない。この様な時のためにタイトルを指定する機能を提供するのが集計プロパティと呼ばれるものである。test2.txtですもともとあったスクリプトブロックにexpressionというキーを付け、加えてnameというキーでタイトルを追加している。キーと値のセットなので指定形式は@{}がついた連想配列形式になる。2個のキーと値の設定を1行で書いているので間にセミコロンを入れている。コマンドラインからではなくスクリプトファイルとして書くのならば以下のように書くのも良いかも。mode,$filepropちなみに、上記のハッシュテーブルは以下のように書いても良い。"です"}と、思っていたのだが・・・。実際以下のようにどうみても同じに見える。$fileprop2のほうは以下のようなエラーになる。いずれかに変換することはできません。DictionaryKeyUnknownType,Microsoft.PowerShell.Commands.SelectObjectCommandだいぶ悩んで$fileprop1と$fileprop2の違いを調べたがどうにもわからない。個人的にはバグ(bug)にしか思えないのだが・・・・。1の書き方をすればよいだけなので放置。最後にSelect-Objectの使い方(オプション)を。集計プロパティを使っているが、コメントにしてあるAdd-Memberのほうを使ったも結果は同じになる。1</結果は以下の通りなのだが、またしても色々と嵌った。(嵌ってばかりだ・・・)まず、Indexパラメータ。Propertyパラメータと一緒に使えないらしい。それじゃSelectじゃないと思うのだが・・・。プロパティが連想配列の時(だけかは?)にExpandPropertyを指定すると中身を展開してくれる。これもPropertyとは併用できないようだ。(こちらはエラーにはならずに無視される)今日もやけに疲れた・・・。受け入れる位置指定パラメーターが見つかりません。コマンドレット◆ショートカットを作るWSHで定番のショートカット作成。◆Compare-Objectは難しい?Compare-Object、エイリアスはCompareちなみに、これまで使った限りでは、XXXX-ObjectのエイリアスはXXXXだ。New-Objectだけ(かどうかは調べていないが)はなぜかNewではだめ。Compare-Objectにはdiffというエイリアスもあるのでそちらのほうが通りがよいかもしれない。本題だが、Compare-Objectを使って以下のありがちなコードを書いてみた。$newps結果はまぁ、予想通りの結果だ。説明するまでもないかもしれないが(私はよく判っていなかった)、「=>」の意味するところは、InputObjectに表示されたものが、diffの引数の右側(第2引数)にしか無いよという事。問題なのは、このスクリプトの4行目と5行目を単純に入れ替えた時だ。すると、結果はこうなる。Tee-Objectなんかしても何やらおかしい。4行目のコメントをはずすと、GetTypeの表示の他に6行目のGet-Memberが有効になる。BUGなのか私の知らない仕様が存在するのか・・・・。そもそもCompare-Objectのヘルプによると、このコマンドレットのパイプライン出力は無いと書いてある。出力されるのがたまたま(BUG?)で出力されないのが正しいのかもしれない。いうわけで、Cpmpare-Objectのパイプライン出力には触れないのが得策の様だ。Cpmpare-Objectにはパイプライン出力用のpassthruスイッチが用意されているのでそちらを使うのがまっとうな使い方なのだろう。ここでもTee-Objectはダメっぽい。いうか私が何か理解不足なのか。個々のプロパティが一つのクラスとして表示されている。そのどれもがProcessクラスというのはどう考えてもおかしいような・・・。ん~、Teeも使わないことにする。紆余曲折し悩んだが、最後にまっとうなCompare-Objectのサンプルを。上記のPassthruでやってくるProcessオブジェクト、型としてはProcessなのだが、Powershellが独自にプロパティを追加しているようだ。以下でそれを表示してみる。name,membertype$result.Kill()結果は以下の通り。例の差異を表す「<=」がNotePropertyとして追加されているのが判る。あぁー、なんか疲れた。コマンドレット◆コンソール出力のオブジェクトマージ機能を回避する次のような何の変哲もないコマンド。これを2行続けた以下のようなスクリプトを書くとどうなるか。普通は全く同じ結果を予想すると思うが、実際にやってみると若干違った結果が返ってくる。(ISEで実行)結果がマージされて出力されいる。意外と普段気が付かないがPowershellは出力バッファ内の同じタイプのものはマージして見やすい出力結果に変えてくれている。通常はこの方が見やすい事は確かだと思うのだが、自分で出力結果を整形したい場合などには若干困ったことになる。その場合は以下のようにひと手間掛けてあげるとよい。"Five"ValidateSetAttributeを使って変数の値範囲を制限してみた。本質的な部分はGet-LimitedArg関数の部分だけなので簡単に実装できる。関数分けしたりトラップしたりがベタなコードになってしまったが、とりあえずこんなこともできるよという事で。ような判定を行っているが、.NETであればこの場合$objectはbool型である。Powershellの場合$objectの型は何でもOKだ。基本的には、その型の初期値であればFalse、それ以外であればTrueと覚えておくと覚えIやすい。(厳密には若干不正確な説明かもしれないが)以下に例を示す。◆IPアドレスを検証する有効なIPアドレスを検証する。正規表現などを使って検証する例も見かけるが、こんな方法もある。-as演算子で型変換すると変換できない場合はエラーにならずにNullになる。変換してみてOKなら正しいと判断する。if($object)という使い方、ここではさしあたってNulの時にFalseになる。$null結果はこんな感じになる。メールアドレスの検証も同様に、こんな感じで。共有フォルダーの設定と解除を行う。share結果は以下の通り。◆特殊フォルダーの取得EnvironmentクラスのGetFolderPathメソッドを使うと取得できる。◆コンピュータにしゃべらせるこれは面白い。COM◆PowerGUIを使うPowershllISEが出る前に使っていたのだがISEが出てからは使っていなかった。最近また使い始めたらだいぶパワーアップして実に便利なので紹介しておく。PowerGUIインストールは何も難しいことはない。使い勝手としてはPowershellにVisualStudioのインテリセンスがやってきた、という感じであろうか。しても起動はちょっと重いが、起動してしまえば快適そのものである。インストールすると以下の2つのアイコンが登録される。通常はScriptEditorのほうを使ってスクリプトを書いていくことになる。一つのほうがはVisualStudioでいうところのソリューションエクスプローラーみたいなものかと思っているが、私は使っていないので詳しくはわからない。(追記:システム管理ツールですね)コマンドレットを打ち込んでいくと以下のような感じで候補を表示してくれる。シンタックスも表示してくれるのは実にうれしい。パラメーターもちゃんと表示する。コードスニペット挿入の機能もある。スクリプトを実行すると変数ウインドウに自動変数なども含めて現在のスコープの変数が表示される。これでを参照すればデバッグ効率は格段に向上する。あと、私が気に入っているのがこのボタン。これは現在のスクリプトを新しいセッションで外部ウインドウとして実行してくれる。ISEを使っていたときは、通常のスクリプトとして実行した時とISEで実行した時の結果が違うことがあるので、いちいち両方でテストするのが面倒だったが、これがあるおかげでクリーンな状態で簡単にテストができる。私はWindowsLiveWriterを使ってブログを書いているのだが、なにより嬉しかったのがアドオンでWindowsLiveWriterにソースを張り付ける機能が提供されていたこと。WindowsLiveWriter自体にもソースコード挿入用のアドインはあるのだが、当然Powershell用のシンタックスは用意されていないため色分けとかが効かない。PowerGUIのアドオンの追加は若干面倒なので(結構悩んだ)ちょっと説明しておく。アドオン用のコミュニティサイトが開くので好きなものを選んでダウンロードする。今回は試しに以下のBlueConsoleを選んでみた。解凍して出てきたファイルを以下のフォルダーにコピー。(必ずしもここじゃなくともよいのだとは思うが、ここにしろと書いてあったので)D:\Documents\WindowsPowerShell次に以下のメニューを開く。ここで解凍したフォルダーを選べばOK。していたらいつの間にかうまくいったのだが今日やるとうまくいかない。そこで、元から存在していたBitsモジュールの場所を探してそこに置いてみたらビンゴ。C:\Windows\System32\WindowsPowerShell\v1.0\Modulesもう一度PowerwGUIに戻ってライブラリーメニューを開くとAdd-on.BlueCOnsoleが表示されているのでチェックをつけてOK.エディター画面に戻ると以下のようにコンソール出力がBlueになっている。会社の環境で試したら、今度は最初の手順でOKだった。わからないが、まぁどちらかの方法で追加できることは確実なようだ。◆複数のWord文書を纏めて1つにする。自己紹介minminnana地方でSE(プログラマ)をやって20年。気づけばいつの間にやら窓際人生。このまま余生を過ごすには若干心残りな2児と2匹(ウサギ、犬)の父。SEと言っても窓際なのでブログやWEBなどにはめっぽう疎い・・・。独学で.NET系を弄ってみるがCOBOLプログラマーにはだいぶ敷居が高い。