2011年1月26日水曜日

◆共有ファイルの使用者を調べる

ファイルサーバーにあるOfficeファイルなどを使っていると他人が使っていて、参照モードでしか開けない事がある。

Officeのユーザー名に名前が設定してあれば誰とバッティングしているか判るのだが、設定していない人とバッティングするとひたすら待つしか無い。

そこでファイルの使用者を調べるスクリプトを作ってみた。
Openfiles.exeを使うとOpen中のファイルを取得できるので、これを使った。
(基本的には管理者権限が必要になってくると思うので使用できる人は限られるかもしれない)

001
002
003
004
005
006
007
008

#サーバーのOpen中ファイルを調べる
$filename = "*進捗.xlsx"

$file = "開いているファイル (パス\実行可能ファイル)"
openfiles /query /S ServerName /U domain\administrator /P Password /fo csv |
 
 
ConvertFrom-Csv |
 
 
?{$_.$file -like $filename} |
 
 
ft アクセス,$file -auto

◆コンピュータをShutdownする(Stop-Computer,Restart-Computer)

以前からShutdown.exeが使えたが、Powershellでは専用のコマンドレットが用意された。
Stop-Computerコマンドレットだ。
Stop-Computerと打つと、Windowsのスタートメニューからシャットダウンを選択したのと同じ動作をする。(未保存のドキュメントなどがあると確認ダイアログが表示される)

Stop-Computer –Force とすると未保存のドキュメントがあろうがなかろうが強制的にシャットダウンする。

ComputerNameパラメータを指定するとリモートPCのシャットダウンにも使える。
Stop-Computer –Comp HogePC –Credential (Get-Credential)

ログイン中のユーザーが居るとエラーになるので、その場合はForceスイッチを指定する。
(当然未保存のデータは無視される)

ComputerNameパラメータは配列が指定できるので複数のPCを一気にシャットダウンしたいときは便利だろう。

Stop-Computerコマンドレットは内部的にはWMIのWin32_OperatingSystemを使っているので、直接これを使っても同じことが出来る。

ちなみに、再起動にはRestart-Computerコマンドレットを使う。

2011年1月24日月曜日

◆WMIオブジェクトを探す

PowerGUIにはWMI Browserなる機能が有って、WMIオブジェクトの全体を俯瞰したり検索したり出来る。
以下は、CIMV2からdriverという名前でフィルターしてみた例だ。
20110124160238

色々探してみると面白いオブジェクトがあるかもしれない。

ちなみに、PowershellからWMIオブジェクトを検索するのは以下のような感じだ。

gwmi -List | Select-String driver

2011年1月21日金曜日

◆グループ集計(ブレーク集計)

PowerShell: ◆グループ化して最終データを生かすでGroup-Objectコマンドレットを使ったときにグループ集計もやってみようと思い、そのままになっていたので試してみようと思う。

そもそも、かつてはプログラムといえば「ソート、マッチング、ブレーク集計」するための物。
なのでグループ集計なんて簡単にできるのかと思ったのだが、意外と「これ」といったコマンドが見つからない。
仕方なく、ごねごねとやって見る。

ファイルサーバーで容量を食っているファイルはどんな種類のファイルかを見てみたかったので、まずはある拡張子のファイルを抽出して容量の合計を求める。

PS>(dir d:\documents -Filter *.xlsx -r | measure length -sum).sum /1kb
86.802734375

あとは、これを特定の拡張子だけではなく全てのファイルに対して行えば良い。

001
002
003
004
005
006
007
008
009
010
011

Dir d:\documents -r | ?{!$_.psiscontainer} | Group-Object Extension | %{
 
$len = $_ | select -ExpandProperty Group | measure -Sum -Property length
  $len = $len.sum / 1kb
  Add-Member -Type NoteProperty -Name Length -Value $len -Input $_ -PassThru
} |
 
   
sort length -Descending |
 
   
ft name,count,
@{
                    name
="length(kb)"
                    expression={$_.length.ToString("#,##0.0"
)}
                    alignment
="Right"
                    } -auto

20110121115837

もう少しすっきり書けても良いような気はするのだが・・・。

◆パイプライン入力のプロパティを使う

誰でも使っていると思うが、パイプライン入力を参照するには「$_」を使う。

PS>dir | %{$_.fullname}
C:\Users\minminnana\Desktop
C:\Users\minminnana\Documents
C:\Users\minminnana\Favorites
C:\Users\minminnana\Links
C:\Users\minminnana\test

これは次のような局面でも同様に使える。例えば、ファイルの最終アクセス年でグルーピング。

PS>dir d:\documents -r | Group {($_.LastAccessTime).Year}

Count Name                      Group
----- ----                      -----
  640 2010                      {Downloads, Fax, Integration S
   26 2011                      {SQL Server Management Studio,

Selectでも同様。

20110121154654

この場合、項目名のタイトルが($_.LastAccessTime).Yearとなるが、このタイトル名を指定するのが、これまでにも何度か出てきた集計プロパティという事になる。

PS>dir d:\documents -r | select name,@{name="Year";expression={($_.LastAccessTime).Year}}

◆Getコマンドレットの隠れたエイリアスを使う

Get-ChildItemコマンドレットのエイリアスを調べるには、次のようにすれば良い。

PS>Get-Alias -Definition Get-ChildItem

CommandType     Name                                                          Definition
-----------           ----                                                          ----------
Alias                   dir                                                           Get-ChildItem
Alias                   gci                                                           Get-ChildItem
Alias                   ls                                                             Get-ChildItem

エイリアスが定義されていない場合は以下のようになる。

PS>Get-Alias -Definition Get-Acl
Get-Alias : definition 'Get-Acl' を含むエイリアスは存在しないため、このコマンドは一致するエイリアスを見つけられません
発生場所 行:1 文字:10
+ Get-Alias <<<<  -Definition Get-Acl
    + CategoryInfo          : ObjectNotFound: (Get-Acl:String) [Get-Alias]、ItemNotFoundException
    + FullyQualifiedErrorId : ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand

しかし、このGet-Aclコマンドレットには実はエイリアスが存在する。
「Acl」である。

どうも、Get-XXXXコマンドレットは全てGetを省略したXXXXがエイリアスになっているようだ。
なので、Get-ChildItemもGet-Aliasコマンドでは表示されてこないが、「ChildItem」だけで実行可能だ。
Get-ChildItemなどはdirとかlsを使ったほうが便利なのでChildItemを使うことはないだろうが、Get-Aclの様にエイリアスが定義されていないコマンドレットの場合は覚えておくと便利だろう。

◆SQL Server Powershell リソース

 

SQL Server PowerShell の概要

SQL Server PowerShell を使用した管理手法 第 1 回 概要編

SQL Server PowerShell を使用した管理手法 第 2 回 実践編

Server クラス (Microsoft.SqlServer.Management.Smo)