2011年6月29日水曜日

◆クリップボードを使う

Clipboardクラスを使えばクリップボードへの設定、取得も簡単にできる。

ただし、こいつはSTAモードを要求するようだ。

001
002
003
004
005
006
007
008

Add-Type -AssemblyName system.Windows.Forms
$cp = [Windows.Forms.Clipboard]

#ClipBoardに設定
$cp::SetText("Test ClipBoard")

#ClipBoardから取得
$cp::GetText()

クリップボードに送るだけなら、「Clip.exe」を使うのが良いだろう。

gcm –type cmdlet | select name | clip

2011年6月28日火曜日

◆STAモードで実行されているか判定する

PowerShell: ◆ファイルオープンダイアログを使うなどの様にSTAモードが必要とされることがある。

STAモードかどうかを判定するには以下のように$host自動変数を使用すれば良い。

image

2011年6月27日月曜日

◆特定のプロセスに色をつけて表示する

PowerShell: ◆switchステートメント2のサンプルとして特定のプロセスに色を付けて表示してみた。

もう少しスマートに書けそうな気もするが、とりあえず結果だけは良さそうだ。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018

$redProcess = @("explorer","notepad")
$yellowProcess = @("sakura")

switch (Get-Process
) {
  {
$true}{$psName = $_.
name}
  {
$redProcess -contains $psName
} {
   
Write-Host ($_ | Out-String -Stream | Select-String $psName) -fore Red
    continue
  }
  {
$yellowProcess -contains $psName
} {
   
Write-Host ($_ | Out-String -Stream | Select-String $psName) -fore Yellow
    continue
  }
# default {
  {$true
} {
   
$_
  }
}

image

CPU使用率の高いプロセスに色をつけるなどすれば実用性もあるかもしれない。

◆switchステートメント2

PowerShell: ◆switchステートメントの補足。

switchステートメントは入力に配列を指定することも出来るようだ。

001
002
003
004
005
006
007
008
009
010

switch (ps|%{$_.name}) {
 
'explorer'
 {
   
"explorer is found";continue
;
  }
 
'outlook'
 {
   
"outlook is found";continue
;
  }
 
default {
  }
}

これはファイルを読み込んでの判定も読込結果は配列となっているわけだから同じことかな。

breakやcontinueを記述しなくてもエラーにはならない。
ただし、その場合はすべての条件判定が行われるので複数の条件にヒットするケースが出てくる。

なので、逆に必ず一つの条件にしかヒットしない場合はbreakかcontinueを記述しないと非効率になりそう。

2011年6月22日水曜日

◆文字列に変換して検索

あるプロセスが起動されているか判定する。

001
002
003
004

( Get-Process | select name ) -contains "explorer" #false
( Get-Process | %{$_.name} ) -contains "explorer"  #true
( Get-Process | select -ExpandProperty name ) -contains "explorer" #true
( Get-Process | Out-String -Stream ) | Select-String "explorer" -Quiet #true

1行目の様に書いてしまうとcontains演算子の左辺はプロセスオブジェクトなのでFalseになってしまう。

そこで、文字列に変換して判定する。
単純に変換すると2行目のような感じかな。

3行目はExpandPropertyを使っている。
通常こいつはプロパティを展開するときに使うが、副作用?としてプロパティを文字列で返してくれるようだ。

4行目の様に、纏めて文字列にして純粋に検索するというのも有りかと。

2011年6月21日火曜日

◆Zipファイル(圧縮ファイル)を作る2

PowerShell: ◆Zipファイル(圧縮ファイル)を作る(改)で作ったサンプルを基に実際にファルのバックアップ処理を行ってみたのだが、なんとなく動きが怪しい。
ファイルに排他がかかっていたり、出来上がったZipファイルがヘッダーのみだったりと動作が安定しない。

色々と試行錯誤し状況から考えるに、どうもこのCopyHereメソッドは非同期で動いているんじゃないかしらん?と思い始めた。

ネットを調べると案の定、同じ現象に遭遇している人がちらほら居て、やはり非同期動作のようだ。(圧縮は非同期、解凍は同期とのことらしい)

そこで、圧縮後に行っていた処理を止めてCopyHereが最終処理になるよう修正してみた。
ISE環境でテストしてOKだったのでタスクスケジューラに登録して運用したところ、やはりうまくいかない。

ん~、そうかCopyHereが終わる前にプロセスが終わってしまうのねん・・・。

また、ネットで調べてみると以下のスクリプトが公開されていた。
ZIP.PS1の詳細情報 : Vector ソフトを探す!

汎用的に使うのであればこれを使わせていただくのが良さそうだ。

私的には、そこまでではない(スケジューラタスクなので時間が掛かっても問題ない)ので単純にCopyHereの後にSleepを噛ませて回避した。

2011年6月20日月曜日

◆特殊フォルダーにドライブをアサインする

特殊フォルダーに対してPSDriveを割り当てるサンプルがあったのでメモしておく。

Profileで割り当てておけば、Startupの様に階層の深いフォルダーにアクセスするときは便利かもしれない。

001
002
003
004
005
006
007
008
009

[System.Enum]::GetNames([System.Environment+SpecialFolder]) |
%
{
 
New-PSDrive -Name ($_) -Root ([System.Environment]::GetFolderPath($_
))  `
 
-PSProvider FileSystem | Out-Null
}

dir startup:
desktop:\test.txt
notepad
 (cvpa desktop:\test.txt)

こうしておくことにより、スタートアップの中身を確認するには、
dir startup:
とするだけで良くなる。

ただし、外部プログラムにパスを渡すときは、Convert-Pathを使って実際のパスに変換する必要がある。

2011年6月13日月曜日

◆配列覚書

配列関連でちょっと忘れていたので再確認。

  1. 0個の配列定義
    $a = @()
  2. 1個の配列定義
    $a = @(3)
    もしくは
    $a = ,3
  3. 配列の足し算
    PS>$a = 1,2
    PS>$a + 4
    1
    2
    4
  4. 配列の掛け算
    PS>$a = 1,2
    PS>$a * 2
    1
    2
    1
    2

減算と除算は定義されていないようだ。

2011年6月9日木曜日

◆カスタマイズした条件を使ってグルーピングする(Group-Object)

Group-Objectコマンドレットを使ってグルーピングする時に、Keyとなるプロパティをカスタマイズして独自な条件でグルーピングを行うことが出来る。

また、AsHachTableパラメータを付加してハッシュテーブル化しておけば、それぞれのグループをダイレクトに参照することも出来るようになる。

001
002
003
004
005
006
007
008
009
010
011
012
013
014

$criteria = 
{
 
switch($_.
CPU)
  {
    {
$_ -lt 1}{"Low";break
}
    {
$_ -lt 10}{"Mid";break
}
    {
$_ -lt 20}{"High";break
}
   
default {"Higher";break
}
  }
}


$CPU = Get-Process | Group -Property $criteria -AsHashTable -AsString
$CPU
$CPU
.Higher

image

2011年6月6日月曜日

◆IPアドレスを取得する

やり方はいくつかありそうだが、普通にやるとこんな感じだろうか。

001
002

[system.net.dns]::GetHostAddresses((hostname))  | 
 
?{$_.AddressFamily -eq "InterNetwork"} | %{$_.IPAddressToString}

hostnameコマンドでホスト名を取得し、そこからIPアドレスを求めている。
とりあえず、IPv4のみを拾ってみた。

文字列ベースで取得するのであれば定番のipconfigでも良さそうだ。

001
ipconfig | grep ipv4 | %{($_ -split ": ")[-1]}

grepはPowerShell: ◆文字列で抽出するFilterを作るで作ったものを使った。
抽出された行を「: 」で分割し、添字[-1]で参照することによって最後のものを抽出している。

2011年6月2日木曜日

◆ハッシュテーブルをコピーする

ハッシュテーブルは参照型なので単純に代入すると参照がコピーされる。
値としてコピーするにはCloneメソッドを使うと良さそうだ。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018

$person = @{}

$person.name = "菅直人"
$person.party = "民主党"

$person2 = 
$person
$person3
 = $person.clone()

$person.name = 
"小沢一郎"

"<person>"

$person | Out-Host

"<person2>"
$person2 | Out-Host

"<person3>"
$person3 | Out-Host

image