昔からあるし使い方も難しくない。
相対パスを絶対パスにしてくれたり、ワイルドカードを展開してくれたりする。
Officeのインストールパスを取得するサンプルが載っていたのでメモしておく。
バージョンが違ったり、64ビットだったりしても問題なく取得できる。
(あくまでもデフォルトパスにインストールした場合だと思うが)
昔からあるし使い方も難しくない。
相対パスを絶対パスにしてくれたり、ワイルドカードを展開してくれたりする。
Officeのインストールパスを取得するサンプルが載っていたのでメモしておく。
バージョンが違ったり、64ビットだったりしても問題なく取得できる。
(あくまでもデフォルトパスにインストールした場合だと思うが)
| 001 002 003 004 005 006 007 | gwmi win32_desktop | ?{$_.name -eq "NT AUTHORITY\SYSTEM"} gwmi win32_desktop -filter "name='NT AUTHORITY\\SYSTEM'" gwmi win32_desktop -Filter "name='$env:userdomain\\$env:username'" [wmi]"win32_desktop='NT AUTHORITY\SYSTEM'" |
「¥」の扱いにちょっと注意が必要。
WMIの世界ではエスケープが必要で、PowerShellの世界ではエスケープが不要って事かな。
別セッションに変数を渡すサンプル。(V3からの機能だそうです)
| 001 002 003 004 005 | $class = 'Win32_LogicalDisk' $ComputerName = 'hogePC.sample.co.jp' Invoke-Command -ScriptBlock { Get-WmiObject -Class $using:class } -ComputerName $ComputerName |
バックグラウンドジョブを使うときなんかに重宝するかも。
参考までにV2でやるにはこんな感じでパラメータ渡ししてあげるらしいです。
| 001 002 003 004 005 006 | $class = 'Win32_LogicalDisk' $ComputerName = 'vista3.ad.ics.co.jp' Invoke-Command -ScriptBlock { param($class) Get-WmiObject -Class $class } -ComputerName $ComputerName -ArgumentList $class |
以前もちょっと取り上げたV3で追加になったコマンド。
実際に使う機会があったのでサンプルとして記載しておく。
かつてノーツで作られていた議事録をSharePointに移行したリストがあったのだが、移行ツールに不具合があるのか稀に添付文書のリンク切れが発生している。
そこで、リンク切れをチェックしてリストアップするスクリプトを書いた。
リスト形式(一覧)では添付の有無しか判らず、そのパスは明細を読む必要がある。
そこで、リストを一旦CSVに落として添付があるものについて「Invoke-WebRequest」で読み込んでみる。
そこから「href」に「Attachment」(すなわち添付)の文字があるものを抽出して存在チェックする。
とりあえず存在チェック自体も「Invoke-WebRequest」で読んでみてエラーになるかどうかで判断している。(これについては他にもっと良い方法が有るのかも・・・)
| 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 | $url = "http://server/sites/hoge/MEETING/Lists/List/DispForm.aspx?ID={0}" $csv = Import-Csv "F:\Desktop\打ち合わせ報告書.csv" -Encoding default $csv | %{ if($_.添付 -eq 1){ $_.整理番号 | Tee-Object -Variable number $urlString = $url -f $_.ID $web = Invoke-WebRequest -uri $urlString -UseDefaultCredentials $web.links | ?{$_.href -like "*attachment*"} | %{ $_.href | %{ Invoke-WebRequest -uri $_ -UseDefaultCredentials | Out-Null if($? -eq $false){$number >> "F:\Desktop\整理番号.txt"} } } } } |
昔、ほぼ同じことを以下でやっているが忘れていたのでメモ。
PowerShell: ◆カスタマイズした条件を使ってグルーピングする(Group-Object)
以下のようなCSVファイルを読み込んで、ハッシュテーブル化すると各項目をダイレクトに参照出来て便利だよってお話。
| 001 002 003 004 005 | $content = Import-Csv "F:\Desktop\Servers.csv" $hash = $content | Group-Object -AsHashTable -AsString -Property Name $hash["sv4"].OS $hash.sv3.SP |
タスクスケジューラに登録されたタスクの一覧を表示するスクリプトがあったので試してみた。
それ自体は特に問題はない。
複数サーバーのタスクをクライアントから覗けるとベターかと思うのだが、昇格した管理者権限が要求される。
以前PowerShell: ◆別の資格情報で管理者として実行するでちょっとやったのだが、もう一度ちゃんと調べてみたところPowerShellをネストして呼び出すというのが主流のようだ。(別の資格情報でPowerShellを起動し、その中でまたPowerShellを起動し昇格してコマンド実行)
コマンドを単独で実行するサンプルはあったのだが、スクリプトブロックを実行するサンプルが見当たらなかったため試行錯誤で作ってみた。
文字列の扱いが面倒で、都度エラーに対処しながら書いたのでスマートな書き方では無いかもしれない。(前回同様パスワードは予め保存しているものを使っている)
| $password = ConvertTo-SecureString (gc f:\myPass) $cred = New-Object System.Management.Automation.PsCredential "ad\adm",$password
$cmd = { $computers = 'hoge-sv','v064' #★対象サーバー $service = New-Object -ComObject Schedule.Service $computers | %{ $service.Connect($_) $folder = $service.GetFolder('\') $tasks = $folder.GetTasks(1) Write-Host 'ComputerName = ' $_ -ForegroundColor Yellow $tasks | ft Name, Enabled, LastRunTime, LastTaskResult, NextRunTime -auto } }
$sc = "-command &{Start-Process PowerShell -ArgumentList {-noexit -command $cmd} -Verb runas }" Start-Process -Credential $cred -FilePath PowerShell.exe -ArgumentList $sc |
| >([wmi]"Win32_userAccount.Domain='ad',Name='hogeUser'").GetRelated('Win32_Group') |
ローカルマシン上のグループにも属している場合は、ローカルグループも表示される。