2014年8月22日金曜日

◆Measure-Objectで日付型のMAXは取得できない

WindowsUpadateの最終更新日を取得する。

Get-HotFix | Measure -Maximum -Property InstalledOn

てな感じで取得できそうな気がする。(実際、Windows8では取得できる)

しかし、Windows7では以下のようなエラーが・・・。

image

えぇー、数値しか駄目なの(><)

仕方がないので力技(一旦数値に変換してから戻す)

PS>[datetime][long]((Get-HotFix | select {($_.installedon).ticks} | measure -Maximum -Property '($_.installedon).ticks').Maximum)

まだ、以下のほうが良いか

PS>(Get-HotFix | sort installedon -Des | select -First 1).InstalledOn

ちゃんとやっている方もいらっしゃる
Measure-Latest: finding latest date/time | Dmitry's Blog: Cloud, PowerShell and beyond

 

Windows8が大コケしたおかげで、PowerShellも2.0がまだまだ幅を利かせてしまうので、ちょっと悩ましい。

2014年8月20日水曜日

◆変数の値解決?

ネットで見かけた質問で以下のようなものがあった。

$drive = ""
$cmd = "dir $drive"
$drives = "c:","d:"

foreach($drive in $drives)
{
    Invoke-Expression $cmd
}

なんとなく眺めるとうまくいくような気もする。

Invoke-Expressionをやめて単純に$cmdを表示させると、

PS>$drive = ""
$cmd = "dir $drive"
$drives = "c:","d:"

foreach($drive in $drives)
{
    $cmd
}

-- 以下、結果--

dir
dir

 

これまた意外と嵌れば嵌るのかもね・・・っと思ったり。

要は2行目の、
$cmd = "dir $drive"

のときに、$driveは値解決されちゃうので$cmdの中身は”dir”になっちゃう。

どうすれば良いんですかね・・・。

こんな感じ?

$drive = ""
$cmd = "dir {0}"
$drives = "c:","d:"

foreach($drive in $drives)
{
    Invoke-Expression ($cmd -f $drive)
}


もしかして、こんなのがスマートか?

$drive = ""
$cmd = {dir $drive}
$drives = "c:","d:"

foreach($drive in $drives)
{
   
   & $cmd
}

2014年8月13日水曜日

◆嵌る

ここ数ヶ月、火を噴いている突発的な仕事のお手伝いで忙しく、PowerShellともご無沙汰。

だいぶ老化が進んでいるのでちょっと使っていないとすぐに忘れる。
なんとか過去の投稿を見たりして思い出していかないと・・・。


以下のような何の変哲もないコマンドを打ったところ、
image

結果がこんな感じに表示された。
image

?、なんで?

これは、
image

ちゃんと表示される。
image

scriptpropertyだから?なんて思って「types.ps1xml」なんかを見てみても特に「CPU」が特別という事は無い。

しば~らく考えたが、全く持って検討も付かない。

ふと、こんな感じに入力してみたら、
image

あれ、表示された。
image

あ~、そう。
いや~、素人丸出し?

こいつの結果って、
image

こうなっちゃってるのね・・・。
image

あ~、もう、ヘッダーが見えない時点で気づこうよ(笑)

全く持って余計なところで時間をくってしまったが、やりたかったのは以下のようなスクリプト。
image

むか~し、以下で書いたことはあるのだが、どうも今まで有効に使ってこなかった気がする。
PowerShell: ◆カスタマイズした条件を使ってグルーピングする(Group-Object)

ハッシュテーブル化する方法は便利そうなので、忘れないようにしたい。
っと言っても忘れるのだが・・・。(笑)

----

ちなみに、そもそも今回の嵌りは画面の表示サイズとバッファサイズをずらしたのがいけないのだと思います。

image

2014年8月7日木曜日

◆Windows Automation Snapin for PowerShell(メモ)

WASPなんてのが有ったのでメモしておく。

以下のようなWindow操作関連のコマンドレットを提供してくれるようです。

Get-WindowPosition
Remove-Window
Select-ChildWindow
Select-Control
Select-Window
Send-Click
Send-Keys
Set-WindowActive
Set-WindowPosition

一応インストーラも付いてくるのですが、Windows7環境ではなぜか旨くいかなかったので(3.0が必要?)、展開された「WASP.dll」をマイドキュメントにある「WindowsPowerShell」フォルダに「Module\WASP」フォルダを作ってあげてその中に入れてあげると良さそう。

使うときは「ipmo WASP」とやってあげればOK。

2014年7月4日金曜日

◆拡張子毎にファイルをフォルダに振り分ける

  PowerShellの紹介とかサンプルでよく出てきそうなやつ。

以下のようなごちゃごちゃのファイルを拡張子毎にフォルダを作って振り分けてコピーする。

image

001
002
003
004
005
006

$outDir = "d:\Desktop\out1"
dir "d:\Desktop\imp1" | group extension | %
{
 
$outDirEx = Join-Path $outDir $_.Name.Substring(1
)
 
if(!(Test-Path $outDirEx)){mkdir $outDirEx
} 
 
$_.Group | %{copy $_.FullName $outDirEx }
}

結果

image

2014年7月1日火曜日

◆演算子を連結して実行する

PowerShellの演算子は連結して実行できたりする。

PS>"a,b,c,d,e" -split ','
a
b
c
d
e
PS>"a,b,c,d,e" -split ',' -notlike 'c'
a
b
d
e
PS>"a,b,c,d,e" -split ',' -notlike 'c'-replace 'b','{0}'
a
{0}
d
e
PS>"a,b,c,d,e" -split ',' -notlike 'c'-replace 'b','{0}'-join '-'
a-{0}-d-e
PS>("a,b,c,d,e" -split ',' -notlike 'c'-replace 'b','{0}'-join '-') -f 'bbb'
a-bbb-d-e

最後のフォーマット演算子(-f)はなぜか括弧が必要だった。
(優先順位が違うのだろうか)

2014年6月30日月曜日

◆Profileのスクリプト実行をバイパスする

Profileに記述したスクリプトを実行したくないときが稀にある。

そんなときは、起動パラメータを指定すると良い。

>PowerShell –NoProfile

頻繁に使う場合は、スクリプトの先頭に以下を追加しておく。

>Add-Type -AssemblyName PresentationFramework
>if([System.Windows.Input.Keyboard]::IsKeyDown('Ctrl')) { return }

Profile以外でも使えそうな機能なので覚えておくと良さそう。

ただし、この機能はSTAを要求するようなのでPowerShell3.0以降で使うのが良いかも。