SharePointのサイトで表題のようなニーズがあったのでリンクしておく。
とりあえず、機能要件は満たしているように思う。
ネットを眺めていて以下のような質問を見つけた。
findstrでバイナリを検索したい - Microsoft Answers
実際PowerShellだとどうなるのかちょっとだけ考えてみた。
(ちょっとだけなので、とりあえずできるかどうかだけ)
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 | param( $FilePath, $FindHexString ) $hexFileString = -join(get-content $filepath -Encoding Byte | %{[Convert]::ToString($_,16).padleft(2,"0")}) for ($i = 0; $i + $FindHexString.Length -le $hexFileString.Length; $i += 2) { if($hexFileString.SubString($i,$FindHexString.Length) -eq $FindHexString) { return $true } } return $false |
ファイルのパスと検索文字列を受け取って、文字列が含まれているか判定している。
まずは以下で、
Get-Content $filepath -Encoding Byte |
あとはこれをバイト単位(即ち2文字ずつ)でずらしながら検索文字列で舐めてあげる。
細かく試していないのでループの仕方とかは自信がないが、とりあえず雰囲気として検索ができているのではないだろうか。
Windows8などを試すためにVHDブートをしていると、沢山のOS環境が増えてくる。
別環境に切り替えようと再起動するのだが、他の作業をしていたりして気を抜いているとついブートメニューを見逃してしまう事も多い。
再起動する時点で次にブートアップさせるOSが選択できれば便利である。
以下にその方法が書いてあるのだが若干作業が面倒。
bcdeditコマンドでブート・シーケンスを一時的に変更する - @IT
という事でスクリプト化してみた。
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 | $ids = @() $titles = @() bcdedit | %{ if($_ -like "identifier*"){ $words = -split $_ $ids += $words[1] } if($_ -like "description*"){ $words = -split $_ $titles += $words[1..($words.count-1)] -join " " } } Write-Host "Choose Boot Number" -ForegroundColor Yellow for ($i = 0; $i -lt $ids.Count; $i++) { Write-Host ($i+1) ":" $titles[$i] $ids[$i] } $no = Read-Host "No" bcdedit /bootsequence $ids[$no - 1] Restart-Computer |
再起動後にブートさせたいOSの番号を入力してあげれば良い。
ちなみに、このスクリプトをWindows8環境で動かすには「管理者として実行」のショーをカットを作っておくと便利かもしれない。
MTG Blog: ◆Windows8RPでコマンドを管理者として実行する
半年ほど前からiPodシャッフルを使っている。
安くてコンパクトで気に入っているのだが、USBに繋いで充電したままPCをスリープさせてしまうと逆に放電されてしまう。
朝気づくと充電がスッカラカンという事をなんどかやらかして、何かしら対策しないといけないと思い立った。(繋いでいるPCのUSBに依存した現象なのかもしれないが・・・)
スリープイベントを拾ってiPodがつながっていたら警告、って事にすれば良さそうだ。
Get-PSDriveでドライブ情報を取ってきてiPodかどうかを判定すれば良い。
幸い、DescriptionにiPodの名前が入っている。
っと思ったのだが、どうにもこうにもこいつが不思議な動作をする。
Descriptionに名前が入っている時と入っていない時があるのだ。
接続の都度違うとかではなくて、Get-PSDriveを呼ぶ都度?(環境)に違ったりする。
結局法則性がつかめなかったのでGet-PSDriveは諦めて「win32_usbhub」を使うことにした。
イベント自体は以前も使っているので以下と同様にしてみた。
PowerShell: ◆スリープ(Sleep)解除イベントを拾う
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 031 032 | #requires -version 2.0 # # Sleep時にiPod接続の監視 # $iPodString = "Apple Mobile Device USB Driver" $identifier = "EnteringSuspend" $query = "Select * From Win32_PowerManagementEvent where EventType=4" Register-WmiEvent -query $query -sourceidentifier $identifier try{ While($true){ $newEvent = Wait-Event -SourceIdentifier $identifier if(gwmi win32_usbhub | ?{$_.name -eq $iPodString}){ $sam = New-Object -comObject SAPI.SpVoice $sam.Speak("i Pod is connecting." ) } Get-Event -SourceIdentifier $identifier | Remove-Event } } catch{ Write-Warning "以下のエラーが発生しました" $error[0] } finally{ #イベントを削除し購読をやめる Get-Event $identifier | Remove-Event Get-EventSubscriber -sourceidentifier $identifier | Unregister-Event } |
警告は音声を使ってみたが、ココらへんは好みに応じて変更すれば良いだろう。
基本的にはUSBメモリーの抜き忘れなどにも使えそうなので用途はありそうだ。