hack のためのネタ帳, etc,,,

経緯

PowerShell で grep みたいなことしたいなと思って「PowerShell grep」でググってみたのだが ばかり出て来る。
試しに
> dir


    ディレクトリ: C:\Users\kou\Desktop\hoge\a


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019/09/10     19:16             20 a
-a----       2019/09/10     19:16             20 b
-a----       2019/09/09     16:23            147 hello.c


って状況で sls でパイプしてみると以下のような状況に。
> dir | sls hello

a:1:hello a
b:1:hello b
hello.c:6:    printf("hello, world!\n");


やりたいことは
ls | grep hello
なのに
grep hello $(ls)
ってなってる感じ。

他にも、
> Get-WindowsOptionalFeature -Online


FeatureName : Printing-PrintToPDFServices-Features
State       : Enabled

FeatureName : Windows-Defender-Default-Definitions
State       : Disabled

FeatureName : Printing-XPSServices-Features
State       : Enabled

...

FeatureName : Internet-Explorer-Optional-amd64
State       : Enabled



だと
> Get-WindowsOptionalFeature -Online | sls Printing
のように何も出て来ない。
これ、結果を文字列にすると
> Get-WindowsOptionalFeature -Online | ForEach-Object { ECHO "$_" }
Microsoft.Dism.Commands.BasicFeatureObject
Microsoft.Dism.Commands.BasicFeatureObject
...
Microsoft.Dism.Commands.BasicFeatureObject
みたいに "Microsoft.Dism.Commands.BasicFeatureObject" となるので
> Get-WindowsOptionalFeature -Online | sls Basic

Microsoft.Dism.Commands.BasicFeatureObject
Microsoft.Dism.Commands.BasicFeatureObject
...
Microsoft.Dism.Commands.BasicFeatureObject


となる。
そうじゃない。


解決策

とりあえず、
関数でなんとかならんかとがんばってみた。
# Usage: grep <pattern> [<property>]
function grep($pat,$prop) { $Input | ForEach-Object { if ( "$(& {param($a,$b) if ($b -eq $null){$a}else{$a.$b} } $_ $prop)" -Match $pat ) { $_ } } }
実行例
> dir | grep hello


    ディレクトリ: C:\Users\kou\Desktop\hoge\a


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019/09/09     16:23            147 hello.c


> Get-WindowsOptionalFeature -Online | grep Printing FeatureName


FeatureName : Printing-PrintToPDFServices-Features
State       : Enabled

FeatureName : Printing-XPSServices-Features
State       : Enabled

FeatureName : Printing-Foundation-Features
State       : Enabled

FeatureName : Printing-Foundation-InternetPrinting-Client
State       : Enabled

FeatureName : Printing-Foundation-LPDPrintService
State       : Disabled

FeatureName : Printing-Foundation-LPRPortMonitor
State       : Disabled




否定用の -v オプションとか欲しくなるが、とりあえず今日はこのくらいで

Memo

なんかいろいろと不自由なんだが、
{ ... }
はスクリプトブロックと言うらしく無名関数的に使えるらしい。
{ param($a) ... }
とかすると引数も取れるそうな。
呼び出しは頭に & を付けて以下のように使うとのこと。
> $f = { param($a,$b) ECHO $b$a }
> & $f x y
yx 

パイプで渡された内容を関数で受け取るには $Input を使うらしい。

正規表現でマッチングしたいので文字列に対して -Match を用いている。


コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

編集にはIDが必要です