2007/12/16

Get-ChildItemはパラメータのディレクトリ配下にあるFileInfoオブジェクトとDirectoryInfoの配列を返すのでそのLengthプロパティをとれば個数が求まります。たしかにそうなんですけど、hogehogeにファイルがただ一つある場合、配列ではなく一つのFileInfoオブジェクトが返されます。なので、そのLengthプロパティ(バイト数)を取ってきてしまうのです。せめてエラーになればいいんですが、ArrayとFileInfoで同じLengthプロパティを持つための悲劇です。

これを防ぐには、@(Get-ChildItem hogehoge).Lengthとします。ファイルが一個の場合でも強制的に配列にしますので戻り値は1となります。

これではまったー。フォルダ配下のすべてのフォルダにあるファイル数をそれぞれ列挙するスクリプトで@をつけなかったばかりに・・・

PS D:\script> dir -rec |%{if((Get-Item $_.fullname).PSISContainer){[string]@(dir $_.fullname).length + "   " + $_.Fullname}}|more

[string]にキャストしてる理由は、PowerShellが演算子の左の型に右の型をキャストするためです。キャストしないと"    "という文字列をintに変換しようとしてエラーになります。

こういうときに連想配列使いたいですが連想配列って値でソートできないんですよねぇ。(まぁテクはありますが)

元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/12/16/113134.aspx

2006/12/08

コマンドレットオンラインヘルプ作成
http://blogs.wankuma.com/mutaguchi/archive/2006/11/07/43965.aspx
の続編です。本文中のコマンドレットにリンクを張るようにしました。その他いろいろ改善。
旧バージョンをお使いの方は一度*.htmlを削除してください。ファイル名が変わりました。

function Sanitize{
    #サニタイズ処理
    param ([string]$strSource)
    return ($strSource.Replace("&","&").Replace("<","<").Replace(">",">"))
}
 
function MakeLink{
    #用語にリンクを張る
    param ([string]$strSource)
    foreach ($key in $keys){
        $strSource = $strSource -replace "(\s)($key)(\s)",
        ("`$1`$2`$3")
    }
    return ($strSource);
}
 
#キーワードを格納するArrayList
$keys = new-object System.Collections.Arraylist
get-help -category all | ?{"Cmdlet","Provider","HelpFile" -contains $_.category}|
%{if ($_.Name -ne $null) {[void] $keys.Add($_.Name)}}
 
# "Cmdlet","Provider","HelpFile"のカテゴリを持つヘルプをHTML化
get-help -category all | ?{"Cmdlet","Provider","HelpFile" -contains $_.category}|
%{"
" + 
$(MakeLink $(Sanitize (get-help $_.Name -detail|out-string))).Replace("`r`n","
") + "戻る
"| out-file($_.name + ".html")} $temp="" # ヘルプのHTMLのインデックスを作成する # Aliasのヘルプ get-help -category Alias |sort name| %{$temp+=""} # Cmdlet,Provider,HelpFileの各ヘルプ get-help -category all | ?{"Cmdlet","Provider","HelpFile" -contains $_.category} | sort category,name| %{$temp+=""} $temp+="
名前種類簡易説明
" + $_.name + "" + $_.category + "" + $_.synopsis + "
" + $_.name + "" + $_.category + "" + $_.synopsis + "
" out-file index.html -inputobject $temp

コマンドレットとパイプを多用するスクリプトの見やすい記法ってなんかないですかね?自分で読んでもよくわかりませんなこれw

あと気づいたこと。メソッドを呼び出すときはmethodname (parameter)のようにメソッド名と引数の間にスペースを入れてはいけない!VBSとかになれているとはまります。

関数の呼び出しはfuncname param1 param2のようにする(引数は,で区切るのではない!)。関数の戻り値を読むときは$(funcname param1 param2)のようにする。関数中で何か値が返されるとそれがそのまま関数の戻り値になる(returnは明示しなくてもいいということ。複数の値を返すと戻り値は[object[]]の配列になる。逆に値を返したくない場合は[void]にキャスト)

-replace演算子でサブマッチ文字列は$1,$2..に格納される。$は変数の頭文字なので ` (アクサン グラーブ)でエスケープし、`$1とする。もしくは''(シングルクォーテーション)でくくり'$1'のようにする。

そうそう、
get-help -category all | ?{"Cmdlet","Provider","HelpFile" -contains $_.category}|
は、なんで
get-help -category Cmdlet,Provider,HelpFile
にしなかったかというと、このようにしてもなぜかAliasが含まれてしまうからです。Cmdletを指定するとAliasが含まれる仕様のようです。
でも-containsの使い方がわかってよかったです(ちょっとトリッキー?)

元記事:http://blogs.wankuma.com/mutaguchi/archive/2006/12/08/49387.aspx

2006/12/07

PowerShellはXMLの扱いが簡単なので、RSSリーダーを作ってみました。参考にしたのは
Channel9 Wiki: ReadRSS
http://channel9.msdn.com/wiki/default.aspx/Channel9.ReadRSS
です。

function ReadRSS 
{
    param ([string]$url, [int]$maxResults)               # パラメータ URLと取得するタイトル数
    $client = new-object System.Net.WebClient;           # WebClientオブジェクト作成
    $client.Encoding = [System.Text.Encoding]::UTF8;     # EncodingクラスのUTF8プロパティ(スタティック)参照
    $xmldoc =  [xml]$client.downloadstring($url);        # ダウンロードした結果をテキストで得て[XML]にキャスト
    if ($xmldoc.rss -eq $null)                           # rssプロパティがなければ
    {
    # RSS1.0
        "[" + $xmldoc.RDF.channel.title + "]";           # ブログのタイトルを取得。
        $node = $xmldoc.RDF;                             # RDFプロパティを変数に代入
    }else{ 
    # RSS2.0
        "[" + $xmldoc.rss.channel.title + "]";           # ブログのタイトルを取得
        $node = $xmldoc.rss.channel;                     # RSSプロパティを変数に代入
    }
    for ($i = 0; $i -lt $maxResults; $i ++)              # 0からmaxResultの値までループ
    {
         $node.item[$i].Title;                           # channelのItem配列からTitleプロパティを取得。
    }
}
ReadRSS "http://rss.rssad.jp/rss/itm/rss2dc.xml" 10      #RSS1.0の例
ReadRSS "http://blogs.wankuma.com/mutaguchi/Rss.aspx" 10 #RSS2.0の例

ブログのタイトルと記事タイトルが指定数だけ取得されます。RSS1.0/2.0対応です。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2006/12/07/48906.aspx

新しい記事のページへ


Copyright © 2005-2018 Daisuke Mutaguchi All rights reserved
mailto: mutaguchi at roy.hi-ho.ne.jp
プライバシーポリシー

Twitter

Books