1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

シェル芸Advent Calendar 2023

Day 8

PowerShellでnlコマンド

Last updated at Posted at 2023-12-07

PowerShellについてなにもわからないので手探りで使ってみました。
nlコマンドについては説明しませんが、詳細を知りたい方は昔の記事をご覧ください。

PowerShellのnlコマンドレット

残念ながらそんなものは無いようです。コマンドレット(Cmdlet)とはPowerShellで利用可能なコマンドのことです。Get-Commandというコマンドレットを使えばシステムで利用可能なコマンドを取得できます。

linenumをキーワードにnlっぽいコマンドレットがあるか探してみましたが見つかりませんでした。-Nameオプションにはワイルドカードを使用できます。また、PowerShellでは大文字小文字を区別しないようです。

PS> Get-Command -Type Cmdlet -Name *num*
PS> Get-Command -Type Cmdlet -Name *line*

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-PSReadLineKeyHandler                           2.0.0      PSReadLine
Cmdlet          Get-PSReadLineOption                               2.0.0      PSReadLine
Cmdlet          Remove-PSReadLineKeyHandler                        2.0.0      PSReadLine
Cmdlet          Set-PSReadLineKeyHandler                           2.0.0      PSReadLine
Cmdlet          Set-PSReadLineOption                               2.0.0      PSReadLine

nlコマンド相当の処理を書く

ForEach-Objectという、行ごと(オブジェクトごと)に繰り返すコマンドレットがあるので、これを利用すれば簡単に実装できます。nlコマンド相当の処理は以下のように書きます。

PS> ls | ForEach-Object -Begin { $count = 1 } -Process { "{0} {1}" -f $count++, $_ }
1 .vscode
2 3D Objects
3 Contacts
4 Desktop

どこかで見たことあるような構文ですが、これはawkですね。awkで似たように書くとしたらこんな感じでしょうか。

$ ls | awk 'BEGIN { count = 1 } { print count++" "$0 }'

もっと簡潔に書く

ForEach-Objectには便利なエイリアスとして%があるようです。また、コマンドレットだけでなくオプションも簡単に書くことができます。

PS> ls | % -b { $c = 1 } -p { "{0} {1}" -f $c++, $_ }
1 .vscode
2 3D Objects
3 Contacts
4 Desktop

このくらい短く書ければ普段使いもできそうです。

オプションを再現する

よく使いそうなやつだけやってみます。

-v

例えば-v 2

PS> ls | % -b { $c = 2 } -p { "{0} {1}" -f $c++, $_ }
2 .vscode
3 3D Objects
4 Contacts
5 Desktop

-i

例えば-i 5

PS> ls | % -b { $c = 1 } -p { "{0} {1}" -f $c, $_ ; $c+=5 }
1 .vscode
6 3D Objects
11 Contacts
16 Desktop

-fオプションの中には代入式が書けないみたいです。インクリメントはできるのに。

-s

セパレーターをタブに。

PS> ls | % -b { $c = 1 } -p { "{0}`t{1}" -f $c++, $_ }
1       .vscode
2       3D Objects
3       Contacts
4       Desktop

タブは「`t」と書くようです。エスケープしにくいな...

-n ln

デフォルトが左揃えなので、lnの書式ですね。

-n rz / -w

5桁でゼロ埋めの右揃え。:D5を指定すればいいようです。

PS> ls | % -b { $c = 1 } -p { "{0:D5} {1}" -f $c++, $_ }
00001 .vscode
00002 3D Objects
00003 Contacts
00004 Desktop

-n rn / -w

5桁で右揃え。,5を指定すればいいようです。

PS> ls | % -b { $c = 1 } -p { "{0,5} {1}" -f $c++, $_ }
    1 .vscode
    2 3D Objects
    3 Contacts
    4 Desktop


このへんでおしまい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?