全4件 (4件中 1-4件目)
1
文字列をワイルドカードで判定するときハマったのでメモ。正規表現の特殊文字エスケープなどは情報がたくさんあるのですぐ見つかりますが、ワイルドカードの場合どうなるのか見つからず試行錯誤してみました。MSのサイトにもないしね。まず、"abc[]"にマッチするワイルドカード(abcは任意)を思いつくまま動かしてみると"abc[]" -like "*[]""abc[]" -like "*\[\]""abc[]" -like "*`[`]"1と3はエラー、2はFalseを返します。正解は"abc[]" -like "*``[``]"で、バッククオートで二回エスケープするってやつでした。試したのは"[]"だけだけど、たぶん、*?も同様かと思います。なんと、?や*は振る舞いが違う。もう少し研究が必要…。
2021.06.30
コメント(0)
nugetのサイトなんかにある、.netライブラリ。便利そうだけど、powershellでの使い方がいまいちわからないってことが結構あります。つまり…add-type -path "foobar.dll"とやって.netライブラリを読み込んだ後、さて、何が使えるのでしょう。こんなときは、[appdomain]::CurrentDomain.GetAssemblies()|?{$_.location -like "*foobar.dll*"}|%{ $_.definedtypes|?{$_.IsPublic}|%{$_.name}}とやれば読み込まれた型がリストアップされます。(修正2021年10月22日:日本人だな、複数のSを忘れてる)もっと簡単に[appdomain]::CurrentDomain.GetAssemblies()|?{$_.location -like "*foobar.dll*"}|%{$_.exportedtypes}でもいけそう。見付かった型をnew-objectするなり、[型]するなりして、get-memberでプロパティやメソッドを調べればいいね。
2021.06.24
コメント(0)
いや、switchってたって、せっかく買ったのにお蔵入りして3DSばっかやってるあの機械のことじゃありません。powershellのswitch文のすごいところは、「switch」に続くカッコ内(「制御式」というらしい)に、単一の値だけじゃなくて、配列だのコレクションだのをじゃんじゃか書けること。例えばswitch ( gci . ){ {$_.lastwritetime -gt [datetime]::now.AddYears(-1)}{$_.fullname}}でカレントディレクトリにある1年以内のファイルをリストアップできちゃたりする。これ便利だけど、その分、ロジックとか追いにくくて難しいんだよね。そして、もう一つ。制御式とCase句の判定にワールドカードや正規表現などさまざまなオプションが使えること。それだけじゃない。Case句には文字列や数値だけでなく、ブレース({})でくくった任意の式も書けるので、ほとんどどんなことでも判定できちゃう。さて、前置きはこれくらいで、テストパターン。switch -Regex ("a b c d" -split " ") { "a|b"{ "$_`ta_b match" } "a|c"{ "$_`ta_c match" } default{ "$_`tdefault" }}これで、次の結果が出力される。a a_b matcha a_c matchb a_b matchc a_c matchd default
2021.06.09
コメント(0)
powershellの利点のなかに、ディスク以外のシステムもドライブ名+パスでアクセスできることがあります。慣れてくると、これ結構便利だったりしますよね。その一つがレジストリ参照・操作。この前の電源オプションの話でもやったHKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorerなんてのもそう。サクッとワンライナーで書けたのは、powershellがレジストリをドライブ+パス名で扱えるからでした。ところが…どういうわけか、MSが用意してくれたのは、HKCU(HKEY_CURRENT_USER)とHKLM(HKEY_LOCAL_MACHINE)しかありません。要らないと判断した理由は何でしょう。どなたかご存じなら教えてほしいものです。それはともかく、残り3つのハイブもドライブ名にしちゃえというわけで。set-RegDriveを実行しておけばHKCR:HKU:HKCC:のドライブ名がスクリプト中で使えるようになります。Set-RegDrive.ps1function set-RegDrive{ $RegNames=@" CLASSES_ROOT CURRENT_USER LOCAL_MACHINE USERS CURRENT_CONFIG"@ -split "`r`n"|%{$_ -replace "\s","" } $AlreadyDefined = get-psdrive|?{$_.Provider.name -eq "registry"}|%{ ($_.Root -replace "HKEY_","").trim() } $RegNames|%{ $Abbrev = $_ -replace "^(.).*_(.).*",'$1$2' if ( $Abbrev -eq "USERS" ){ $Abbrev = "U" } if ( $AlreadyDefined -contains $_ ){ return } $DriveName = "HK$Abbrev" New-PSDrive -name "$DriveName" -PSProvider "Registry" -root "HKEY_$_" -Scope Script }}
2021.06.08
コメント(0)
全4件 (4件中 1-4件目)
1

![]()
