PowerShellでクリップボードの画像を日時ベースのファイル名で保存

Alt+PrintScreenでウィンドウ単位のスクリーンショットを撮ったときなど、クリップボードに入っている画像にファイル名を自動生成してカレントディレクトリに保存する。

変数インクリメントしていけば連番もできそう。

(Get-Clipboard -Format Image).Save((Join-Path (Get-Location) ("ss_{0:yyyyMMdd-HHmmss}.png" -f (Get-Date))))

Saveメソッドに渡すファイル名はフルパスでないと指定したパスに保存されず、ファイル名のみではユーザのプロファイルフォルダ直下に保存される。なぜ…

PowerShellでパスワード簡易生成

外部ライブラリを使用しないワンライナー

-join (0..7 | %{([char](Get-Random (0x21..0x7e))).ToString()})

パスワードに使用できそうな文字から8文字のパスワードを生成する。ループ回数の調整でパスワード長を変更可能。

PowerShellでフォルダ間比較

2つのフォルダ間で、ファイル単位の比較をしてみる。

前提として$refに比較元フォルダのパス、$difに比較先フォルダのパスを設定している。

diff -ReferenceObject @(ls -Recurse $ref | where {-not $_.PSIsContainer} | gc) -DifferenceObject @(ls -Recurse $dif | where {-not $_.PSIsContainer} | gc)

ファイル数が多いとかなり時間がかかるので注意。文字化けする場合は、gcのオプションに-Encoding UTF8を追加する。

PowerShellを使ってWindowsログオン時の認証に使用したドメインコントローラを調べてみる

Windowsのログイン時認証に使用したドメインコントローラを調べる方法は、ネットを探せば出てくるもののいまいち決め手に欠ける印象。

とりあえずLOGONSERVER環境変数を調べるよりは確実そうなVBScriptのサンプルを見つけたので、PowerShell用に変換して実行してみた。

([ADSI]"LDAP://rootDSE").dnsHostName

上記コードを実行するとドメインサーバ名が表示されているので、きちんと情報は取れているのだろう。複数DC構成の環境で使えれば言うことないのだが、現状では確認不能。機会があったら確認してみよう。

PowerShellとEpgDataCap_Bonの連携

PowerShellは.NETのアセンブリを読み込んで利用できる。ということで、CtrlCmdCLI.dllの機能を呼び出してみた。

コード

[void][Reflection.Assembly]::LoadFrom("CtrlCmdCLI.dll");
$ctrlCmd = New-Object CtrlCmdCLI.CtrlCmdUtil;
$ctrlCmd.SetSendMode($true);
$ctrlCmd.SetNWSetting("127.0.0.1", 4510);
$reservedList = New-Object Collections.Generic.List[CtrlCmdCLI.Def.ReserveData];
[void]$ctrlCmd.SendEnumReserve([ref]$reservedList);
$reservedList | sort StartTime | Out-GridView

単純に録画予約一覧を表示するだけのサンプル。

Out-GridViewは出力を確認するのに便利だな。

PowerShellでTwitterのTimelineを取得

WikipediaのWindows PowerShellの項にあったRSSフィードを取得するサンプルを見ながら作ってみた。

いろいろ面倒なので、Twitter API 1.0のXML版を使用。認証不要のAPIということで、指定したユーザのタイムラインを取得するAPI(/statuses/user_timeline.xml)を選択した。

実験環境はWindows XP上のPowerShell 2.0だが、PowerShell 3.0ではJSONをパースするコマンドレットが追加されているので、認証さえできればTwitter API 1.1にも対応できるかと。

コード

$Url = "https://api.twitter.com/1/statuses/user_timeline.xml?screen_name=(ユーザ名)"
$tl = [XML.XmlDocument](New-Object Net.WebClient).DownloadString($Url)
$tl.statuses.status | ft -AutoSize @{Label="Date"; Expression={[DateTime]::ParseExact($_.created_at, "ddd MMM dd HH:mm:ss K yyyy", [Globalization.DateTimeFormatInfo]::InvariantInfo)}}, text

結果

Date                text
----                ----
2013/02/05 19:09:17 PowerShellがなかなか遊べそうな予感… http://t.co/QdsGXm2C

PowerShell

以前Windows XP環境にインストールしたまま放置していたWindows Power Shellをちょっといじってみた。

基盤技術は.NETなので、Power Shell特有の書式さえわかれば応用が利きそう。

とりあえずテストとして、ドライブ一覧を取得し、準備ができてないドライブ(ディスクの挿入されていないリムーバブルドライブなど)を除外して、ドライブレター、タイプ、フォーマット形式、総容量、空き容量を表形式で出力させてみた。

コード(というかコマンド)

[IO.DriveInfo]::GetDrives() | where {$_.IsReady} | Format-Table Name, DriveType, DriveFormat, TotalSize, TotalFreeSpace

結果

Name                  DriveType DriveFormat          TotalSize TotalFreeSpace
----                  --------- -----------          --------- --------------
C:\                       Fixed NTFS              243822227456    75804323840

なんか遊べそうだし、Windows Home Server 2011の環境で処理動かすのに使えそうなので、ちょくちょくいじってみよう。