個人的割と使うPowerShellワンライナーと注意メモ
よく見ればどこかで見たものばかりのもの…
前提知識
・全てはオブジェクトである。
例えばdirコマンドはコマンドプロンプトでは全てテキストとして表されるが、ファイルひとつに対してPowerShellではそれぞれDate値、Name値といった項目が割り付けられるようになっている。(項目名はうろ覚え…)
仮に dir -Name -Date というコマンドを投入した場合、ファイルの名前(Name)とファイルの更新日(Date)が表示される。この結果を変数に代入することもできるし($argument = dir -Name -Date、これを表示するときは$argumentを指定すれば良い)、パイプライン(dir -Name -Date | foreach-object {$_.Name = $_.Name.trim();$_} における|のこと)でつなげて次のコマンドに渡すこともできる。なおパイプラインにおける$_とは、現在アクセス中のレコード位置と考えると理解が早かったかもしれない。
PS C:\> import-csv .\path\to\csv_format | select-object -first 1
テーブルの1レコードめを表示するだけ。項目を確認するためだけに使う。
PS C:\> import-csv .\path\to\csv_format | select-object id,senddate,ip_addr
例えば、id,senddate,ip_addr,remote_host,action という項目のテーブルがあった時に、id,senddate,ip_addrの3項目だけを抽出することができる。このあと、sort-objectにつなげていくことで順番を並べ替えたり、など。
PS C:\> import-csv .\path\to\csv_format | select-object id,senddate,ip_addr,memo | foreach-object {$_.memo = "passed."; $_}
前コマンドの可変型。id,senddate,ip_addr,remote_host,action という項目のテーブルにはmemoという項目はないが、無理やり付け足すことができる。これによりid,senddate,ip_addr,memoとなり4項目にできる。このあと、foreach-objectにより全てのcsvレコードのmemo値に対して一律 passed を入力する。
PS C:\> import-csv .\path\to\csv_format | select-object id,senddate,ip_addr,memo | foreach-object {$_.memo = "passed."; $_} | export-csv -NoToInformation -Encoding oem .\path\to\csv_format.write
前コマンドの結果をファイルに書き出すというもの。
PS C:\>$hash_access = @{}; import-csv .\path\to\csv_format | select-object id,senddate,ip_addr | foreach-object {$hash_access[$_.id + $_.ip_addr] = remote_host}
この構文を見た時、やっと連想配列の強力さが分かった。特に解説はない。
Excelにおけるvlookupみたいな処理を実現するには理解しておきたい一文。
PS C:\> dir -directory 2021* | foreach-object {$zipname = $_.name + ".zip"; compress-archive -path $_.name -destinationpath $zipname}
このコマンドでは、名前の頭に2021のつくディレクトリをzip圧縮するというもの。
これをよくあるプログラミング言語風にほぐすとこうなる。
dir -directory 2021* |
foreach-object {
$zipname = $_.name + ".zip";
compress-archive -path $_.name -destinationpath $zipname
}
わりかし大したことがないコマンドを1行で書いているだけ。
PS C:\> import-csv log.csv | sort-object -Culture ($_.日時 -as [DateTime]) -Proparty 日時,other1,another2 | export-csv -NoTypeInformation log_sort.csv
日時を照準ソートしたいときに使用。ソートの優先順位はProparty値で指定する
sort-objectの注意点
パイプラインでつなげた場合、ストリーム処理(例:行単位で処理)ができる場合はベルトコンベアのように動作するが、sort-objectの処理はあくまでも全てのレコードが揃った段階でないと処理が行われない:出力が決定できないため、逐次処理にはなりにくい。また、ギガ単位のデータをsort-object処理にかけるとWindowsの挙動が悪くなるため、sort-objectの実行位置はよく考えたほうがいい。
Compress-Archiveの注意点
この記事を書いた時点では2GB以上のファイルを圧縮できない。PowerShellでは他の処理文を書くことにより実現できるが、長いので書かない。同様にコマンドプロンプトにtarコマンドが存在するがなぜかzipでは圧縮効果がない(環境によるかもしれない)。ちなみにWindowsプレーンインストール状態で2GB以上のzip圧縮を行うには、Windows GUIのシェルでzipにするしかない。
Expand-Archiveはそんなことないのに… (ちなみにWindows10から組み込まれているBSD由来tarコマンド の場合でも同じ)
Expand-Archiveの注意点
なんと、ウィルスバスターがインストールされている場合は、zipファイルの解凍がうまくいかないことがある。
気が向いたら書き足すかも・・・
コメント
コメントを投稿