2014年4月30日水曜日

◆UNCパスをTest-Pathで確認する

Testing UNC Paths - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

Set-Location HKCU:\

とかやった後に、Test-Path \\Server\myfolder

とかでUNCパスを確認しようとするとうまくいかないってお話。

\\Server というレジストリーを探しに行っちゃうって事でしょうか。

コンテキストの影響を受けずに確認するには、

Test-Path  FileSystem::\\Server\myfolder

とやると良いとの事。

2014年4月22日火曜日

◆レジストリへのアクセス

レジストリへのアクセスは専用のプロバイダーが用意されていて、通常のファイルシステムのようにアクセスできる。
 特に難しいわけではないのでこれまでも適当に使ってきたが、それほど頻繁に使うわけでもないので、結局毎回試行錯誤しながら使うことになる。

そこで、いまさらの感はあるが使い方を自分用にメモしておく。

基本的には「Get-Item」と「Get-ItemProperty」を使ってアクセスする。(と思う)

以下のレジストリにアクセスしてみる。

image

Get-Item」で「TortoiseSVN」キーにアクセスするとこんな感じになる。

PS>Get-Item hkcu:software\TortoiseSVN


    Hive: HKEY_CURRENT_USER\software


SKC  VC Name                           Property
---  -- ----                           --------
  7  12 TortoiseSVN                    {SoundUtils KeyPath, TortoiseSVN,

「SKC」というのは「SubKeyCount」の略で、以下の部分の個数を表す。
image

「VC」は「ValueCount」の略で、以下の部分の個数を表す。
image

「プロパティ」は以下を指すようだ。
image

 

「Get-Item」を「Get-ChildItem」に変えると以下のようにサブキー毎に同様の情報が表示される。

PS>Get-ChildItem hkcu:software\TortoiseSVN


    Hive: HKEY_CURRENT_USER\software\TortoiseSVN


SKC  VC Name                           Property
---  -- ----                           --------
  0  17 DiffTools                      {.dll, .exe, .doc, .docm...}
  1   1 History                        {lastCheckoutPath}
  0   4 LastUsedUUIDsForGrouping       {0, 1, 2, 3}
  0   1 LogCache                       {Version}
  0   6 MergeTools                     {.doc, .docm, .docx, .ods...}
  0   6 StatusColumns                  {CommitDlgVersion, CommitDlg,
  1   0 TortoiseProc                   {}

プロパティの一覧は以下のように取得

PS>(Get-item hkcu:software\TortoiseSVN).property
SoundUtils KeyPath
TortoiseSVN
TortoiseMerge
TortoiseIDiff
DiffProps
CurrentVersion
CheckNewerWeek
RepoBrowserColumnWidth
ErrorOccurred
NewVersionLink
NewVersionText
NewVersion

これでも同じっぽい

PS>(Get-item hkcu:software\TortoiseSVN).getvaluenames()

ただし、どちらも取得できるのは文字列の情報。

以下の一行の情報をオブジェクトで取得できるのかと思ったのだが、どうにも見当たらない。
image

とりあえずダイレクトにバリューを取得するには、

PS>(Get-item hkcu:software\TortoiseSVN).GetValue("CheckNewerWeek")
16

ここで、「Get-ItemProperty」を試してみると、こちらは以下のオブジェクトを返してくる。(1つのオブジェクト)
「Get-Item」と違ってサブキーの情報は取得できない。
名前の通り、自身のプロパティに特化した情報といった感じ。
image

左側の「名前」(プロパティ)をその名の通りプロパティとして持っているオブジェクトなので、ダイレクトにバリューを取得するには、

PS>(Get-ItemProperty hkcu:software\TortoiseSVN).CheckNewerWeek
16

となる。

これを踏まえて「Get-Item」を使って一覧表示するには、プロパティ(ValueName)を纏めて取得し、その一つずつに対して「GetValue()」でバリュー、「GetValueKind()」で種類を取得する。
image

image

種類が不要であれば「Get-ItemProperty」だけで事足りる。(が、こちらは余計なプロパティも含まれる)

PS>Get-ItemProperty hkcu:software\TortoiseSVN


PSPath                 : Microsoft.PowerShell.Core\Reg
PSParentPath           : Microsoft.PowerShell.Core\Reg
PSChildName            : TortoiseSVN
PSDrive                : HKCU
PSProvider             : Microsoft.PowerShell.Core\Reg
SoundUtils KeyPath     : keypath
TortoiseSVN            : TortoiseSVN
TortoiseMerge          : TortoiseMerge
TortoiseIDiff          : TortoiseIDiff
DiffProps              :
CurrentVersion         : 1.8.4.24972
CheckNewerWeek         : 16
RepoBrowserColumnWidth : 00000000000000000000000000000
ErrorOccurred          : 0
NewVersionLink         :
http://tortoisesvn.net
NewVersionText         : A new version of TortoiseSVN
NewVersion             : 1.8.6.25419

2014年3月11日火曜日

◆PowerShellスクリプトをExeに変換する2

PowerShell: ◆PowerShellスクリプトをExeに変換する

ちょっと使う機会があったのだが、パラメータ指定で躓いたのでメモしておく。

EXEで実行する時はスクリプト実行時と同じ指定ではパラメータが取ってこれない。

調べてみると以下の様に「arguments」指定が必要らしい。

>hoge.exe –arguments –param テストパラメータ

◆WindowsUpdate情報、McAfee情報

McAfeeのDatバージョンとWindowsUpdateの最終更新日を毎月報告せよ、と会社からのありがたーいお達し。

いまどき、「力技でやるんかい」って突っ込みはうちの会社には通用しない。

これまでは某H社の馬鹿高いツールを使っていたのだが、よっぽど評判が悪いのか待てど暮らせどWindows8には対応してこない。

ActiveDirectoryでも入れてちょっとしたツールでも作って情報収集すれば一発なのだが、何があっても(目先の)節約至上主義の会社なので力技をこよなく好む。

とりあえず自分だけは楽をしようとスクリプトを書いてみた。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030

param(
  $mailFrom,
  $mailTo
)
$path = 
"hklm:SOFTWARE\Network Associates\ePolicy Orchestrator\Application Plugins\VIRUSCAN8800"

$prop = Get-ItemProperty -Path $path
#-----
$Session = New-Object -ComObject Microsoft.Update.Session 
$Searcher = $Session.CreateUpdateSearcher() 
$current = $Searcher.QueryHistory(1,1) | select -ExpandProperty date

#-----
$mess1 = "McAfee Datバージョンは 【{0}】 です。" -f $prop.DATVersion
$mess2 = "WindowsUpdate最終適用日は 【{0}】 です。" -f $current

#-----
if($mailFrom -and $mailTo){
  Send-MailMessage    -To $mailTo
                                    `
                     
-From $mailFrom
                                `
                     
-Subject "報告レポート"
                          `
                     
-SmtpServer "hoge.ccc.co.jp"
                  `
                     
-Body "`r`n$mess1`r`n$mess2"
                   `
                     
-Encoding  ([System.Text.Encoding]::
Default)
}

else{
  Add-Type -AssemblyName System.Windows.Forms
  [WIndows.Forms.MessageBox]::Show("$mess1`r`n$mess2") | Out-Null
}

McAfeeのDatバージョンについてはレジストリに持っている値を使ってみました。(確実かどうかは判りません)

WindowsUpdateについては、きっとやり方が色々あるのでしょうが、今回は以下のサイトを参考にしました。
Hey, Scripting Guy! コンピューターに追加されたすべての更新プログラムの一覧を取得する方法はありますか

12行目の「QueryHistory」メソッドで履歴の開始位置と件数を指定する様なので最新の1件を取得してみました。

そのまま実行すると結果をメッセージボックス表示、パラメータを指定するとメール送信としてみました。

------

WindowsUpdateの日付については「Get-HotFix」なんてコマンドレットがあるので、そちらのほうがきっと簡単ですよね・・・。

2014年3月7日金曜日

◆IE画面をアクティブにして最大化

起動中のIEをアクティブにするにはタスクマバーから選択するのが一般的だろう。

通常、ひとつのEXEしか起動していないアプリでは単純にタスクバーをクリックすればよい。

複数のEXEやIEのように複数のタブを開いているアプリケーションはカーソルを持っていくと表示されるサムネイルをクリックすることになる。

一見すばらしい機能なのだが、IEで多くのタブを開いているとサムネイル表示にもたつくこともある。

また、一般的には直近に使っていたタブを使うことが多いと思われる事からサムネイルを省略してとりあえず復帰してよ、っと思うことも多い。

たとえばタスクバーの1番目にIEを表示しているとすると、「Win + 1」で復帰すること自体は可能だ。
しかし、この機能はなぜか必ず先頭のタブを表示してしまう。(><)

単純にもとの状態に復帰するのがなかなか難しい。

「Alt + Tab」や「Win + Tab」なんかは大げさすぎるし、況やフリーソフトのタスクスイッチャーをやである。

どうしてもIEの頻度が最多なので、ダイレクトにIEに戻りたいのだ。

しかたが無いので、PowerShellでちょっと作ってみた。

アクティブにするだけならVBのライブラリーを使ってすぐできるのだが、最大化とかになるといまだにAPIの出番っぽい。

APIについては関数化されている方がいらっしゃるので、そのまま使わせて頂いた。
PowerShellからWin32APIを呼ぶ - 潜在推力
(New-PMethod関数とNew-PType関数)

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

# -----------------------------------------------------------------------
$showWindow          =
 
 
New-PMethod "user32.dll" ([Bool]) "ShowWindow"          @([IntPtr], [Int32])
$setForegroundWindow =
 
 
New-PMethod "user32.dll" ([Bool]) "SetForegroundWindow" @([IntPtr])
# -----------------------------------------------------------------------

$ps = ,(ps iexplore)

$psMain = $ps[0] | ?{$_.MainWindowTitle} 
$showWindow.Invoke($psMain.MainWindowHandle, 3)
$setForegroundWindow.Invoke($psMain.MainWindowHandle)

IEはひとつのWindowで複数のプロセスが動いているのでどれを使えば良いのか良くはわからないのだが、とりあえずMainWindowTitleがあるものを使ってみた。

複数のIEを立ち上げているときはうまい具合に直近に使っていたほうが表示されるようだ。

とりあえず今のところうまく動いているが、非力なマシンでは常駐化とかを考えないと使用に耐えないだろう。(PC起動時もバックグラウンドでごちゃごちゃ動いているので落ち着くまでは遅い)

私はこれにショートカットを割り当て、多機能マウスのボタンに割り当てて使っている。

なんにしても本来PowerShellねたでは無いと思うので具合が良いようであれば別途移植を考えたい。

2014年2月20日木曜日

◆ダウンロードフォルダーのパスを取得する

以下の記事を読んでいて気づいたこと。
Unblocking Download Files - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

ダウンロードフォルダーのパスを「$Home\Downloads」で取ってきているが、私の環境では取得できなかった。

私は基本的にプロファイルにぶら下がったフォルダーはすべてDドライブに移動しているので「D:\Downloads」になっている。

全うな取得方法を探してみたのだが、スペシャルフォルダーとかには「Downloads」は見当たらない。

止む無く、レジストリーを見渡したらIEのキーにDownloadsがあったのでとりあえずそれを使う事とした。

PS>$ieRegKey = "hkcu:\Software\Microsoft\Internet Explorer\Main"
PS>(get-itemproperty $ieRegKey)."Default Download Directory"
D:\Downloads

もう少し全うな方法があるのかしらん・・・

2014年1月20日月曜日

◆Ordered Hash Tableについてもメモ

ハッシュテーブルの順番は通常保証されていない。
image

保証するためには以下のように「Ordered」型に変換してあげる。
image

Insertなんかも出来るようになる。
image

この「Ordered」は3.0から追加された機能なので、2.0で使う場合は「Orderd」の実体である「OrderedDictionary」クラスを使う。
image