おはようございます。こんにちは。こんばんは。
ミッド(@mid_v_lab)です
本日はPowerShellで、ランダム文字で特定桁数を出力する方法をご紹介します。
パスワードを初期化したとき、既定の文字数でランダムの値を作りたいときや、
新規ID作成時に適当なパスワードを設定したいときに便利です。
コードはこれだ!
・数字のみ
-Join (Get-Random -Count 8 -input 0,1,2,3,4,5,6,7,8,9)
・アルファベットのみ
-Join (Get-Random -Count 8 -input a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z)
・数字とアルファベット
-Join (Get-Random -Count 8 -input 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z)
解説
「Get-Random」は、「-input」で指定された文字から、「-Count」で指定された文字数をランダムで取得するコマンドです。
Joinを付けずに実行すると、下記のような実行結果になります。
PS C:\Users> Get-Random -Count 8 -input 0,1,2,3,4,5,6,7,8,9
5
2
3
6
0
9
8
1
これに「-Join」をいれることで、結果をすべてくっつけています。
PS C:\Users> -Join (Get-Random -Count 8 -input 0,1,2,3,4,5,6,7,8,9)
21039578
桁数を変えたい場合は、「-Count ○」の部分の数字を変更します。
例えば「10」に変更すると、10桁になります。
PS C:\Users> -Join (Get-Random -Count 10 -input 0,1,2,3,4,5,6,7,8,9)
1265093478
上記で紹介しているコードでは、数字、アルファベット、両方という3パターンを紹介していますが、「-input」に入れている文字が違うだけです。
数字とアルファベット以外も入力可能ですが、「!」や「%」などPowerShell上で機能する記号は「`(バックダッシュ)」でエスケープが必要です。(変数などではなくて、ただの文字ですと宣言する)
PS C:\Users> -Join (Get-Random -Count 10 -input `!,?,`%,$,`@)
$@%?!
注意
上記の記号を出した例で、おや?っと思った方、勘が良いです。
このコードでは、inputで入れた文字をランダムでCount数分出力するので、Countと同等数のinputが必要です。
例えば、数字のみをCountの数を「11」にすると、10桁しか出ません。(0~9で1個ずつ重複なしで取り出して10桁が最大)
PS C:\Users> -Join (Get-Random -Count 11 -input 0,1,2,3,4,5,6,7,8,9)
5302861974
そのため、数字だけで桁数を増やそうと思ったら、inputの数字を増やしてあげる必要があります。
PS C:\Users> -Join (Get-Random -Count 11 -input 0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9)
40635208157
大抵の場合、8桁とか10桁とかだと思いますので、0~9の1巡で良いと思いますし、アルファベットも含めると、相当な桁数が作成できるので問題にならないと思いますが、
もし数字だけで重複もありで、ランダムな桁数の数列を取り出したい場合は、このコードでは向いていないので、もう少し工夫が必要ですね。
システムの運用業務をやっていると、新規ID作成、パスワード初期化などがいっぱいくるので、こうしたパスワードを自動発行する仕組みを作っておくと手間が減りますね。
今回はランダムの文字列を作成するだけですが、実用化するにはもう少しコードが必要ですね。桁数指定を都度入力したりとか、クリップボードに自動で入れるとか、メール本文を自動生成してコピペできる形式で出力するとか、etc
「0」と「O」、「1」と「l」など、ユーザが勘違いしやすい文字をあらかじめ抜いておくなどすると、よりユーザライクでよろしいかと思います。
ではでは