PowerShell入門

コマンド&スクリプト

LinuxやUnixのコマンドが使える人って、PowerShellってとっつきにくくないですか?
コマンドレットっていう聞き慣れない用語とか、何だかよく分からないオブジェクトを処理する、とか。

特にテキスト整形だけやりたい人は、回りくどい説明を理解しなきゃいけないのが苦痛だったりします。

LinuxやUnixと同じようなことは、できるのか? できるとすれば、どうすればできるのかを、すぐ知りたい。
そんな思いをする人に向けて、簡単に理解できる使い方サンプルをまとめています。

初心者の人にも読めるようにまだまだ見直し中ですが、本記事が、何かの足しになったら幸いです。

対象バージョンは以下です。

Contents

スポンサーリンク

1.PowerShell を始めるには

コマンドプロンプトのようなターミナルウィンドウは、

1. Winキー+R
2. 「ファイル名を指定して実行」で「powershell」

と入力してEnterキーを押せば、起動します。

コマンドプロンプトのように真っ黒ではなく青いウィンドウです。

間違えないように意図して色分けしてるのか、理由は定かではありませんが、色が違うのでコマンドプロンプトとPowerShellのターミナルが、一瞬で見分けられます。(色は変更できます)

(起動時にバージョンアップを促すメッセージが表示されますが、本記事の対象バージョンとは異なるのでそのまま使用します。)

簡単なコマンドを実行してみましょう。

write-output HELLO


HELLOと表示されました。

write-outputの代わりに、echoと入力しても同じ結果になります。

echo HELLO


またまたHELLOと表示されました。

2.PowerShell エイリアス

さきほどの実行した、write-outputとechoという2つのコマンドは、共に引数で指定した文字列を表示するという仕様で、同一結果が得られるコマンドです。

同一結果が得られるというより、この2つのコマンド、実は同一コマンドです。

echoコマンドがwrite-outputコマンドのエイリアスという関係になります。エイリアスとは別名の意味です。
write-outputというコマンドが長くて使いづらいときは、echoという名前でもコマンドが使えるようになっています。

そもそもechoで良いのになんでwrite-outputなんて長ったらしい名前なのか。

逆にこれがPowerShellの良いところでもあります。コマンド名に規則性があるんです。

動詞-名詞

これがPowerShellのコマンドレットの名前のルールです。

たとえば動詞には、SetやGetが入ります。名詞のところには、ItemとかContentとか入ります。

Get-Item
Set-Content

という具合です。

コマンド名の規則性があったとしても、古くからLinuxやUnixのコマンドラインを触っている人には、本当に使いにくい名前が多いので、エイリアスが重宝するわけです。

その他のエイリアスの設定状況を見てみましょう。
get-aliasでエイリアスが確認できます。

エイリアス多すぎでした。

エイリアス名を指定して確認するには、引数にエイリアスを指定します。
get-alias echo

echoが、write-outputのエイリアスであることが確認できました。

先ほども述べたとおり、定義されているエイリアスは、Unix/Linuxのコマンドを使ってる人なら、とても馴染みのある名称となっています。

例えばGet-ChildItem。

エイリアスを知らずに初めてこのコマンドレット名を目の当たりにすると、臆してしまいますが、このコマンドレットのエイリアスはlsです。
lsと聞けば安心できますね。

エイリアスの作成

新規エイリアスを作成するには、New-Aliasコマンドレットを使います。

Get-ChildItemのエイリアスには、dir、gci、lsがありますが、

これにLLも増やしてみましょう。

エイリアスにLLが増えていますね。

LLを実行してみます。大文字小文字どちらでも解釈されます。

PS C:\Users\taku\Desktop> ll -n
folder1
file1.txt
PS C:\Users\taku\Desktop>

エイリアスの削除

エイリアスの削除は、Remove-Aliasではなく、Remove-Itemを使います。

3.PowerShell 変数、関数

変数(変数名と代入/型)

変数名と代入
PowerShellの変数名はPerlのように$から始まります。
代入は、他の多くの言語と同じく、=を使います。

PS C:\Users\takk> $a=1
PS C:\Users\takk> echo $a
1
PS C:\Users\takk>

変数名だけ記述しても値の確認ができます。

PS C:\Users\takk> $a
1
PS C:\Users\takk>


GetType()メソッドで型の確認ができます。

Int32型

PS C:¥Users¥takk> $i=10
PS C:¥Users¥takk> $i.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType


PS C:¥Users¥takk>

Array型

PS C:¥Users¥takk> $arr=1,2,3
PS C:¥Users¥takk> $arr.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array


PS C:¥Users¥takk>

String型

PS C:¥Users¥takk> $str="ABC"
PS C:¥Users¥takk> $str.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object


PS C:¥Users¥takk>

その他のオブジェクト

PS C:¥Users¥takk> $gi=gi .
PS C:¥Users¥takk> $gi


    ディレクトリ: C:¥Users


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2020/07/11     10:51                takk


PS C:¥Users¥takk> $gi.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DirectoryInfo                            System.IO.FileSystemInfo


PS C:¥Users¥takk>

定数(定数定義/定数削除)

定数定義

定数は、Set-Variable(エイリアス sv)の-OptionでReadOnlyを指定して定義します。Set-Variableの変数名を指定する-Nameオプションは省略できます。

PS C:\Users\taku> sv a -val 10 -op readonly
PS C:\Users\taku>
PS C:\Users\taku> $a
10
PS C:\Users\taku> $a=3
変数 a は読み取り専用または定数であるため、上書きできません。
発生場所 行:1 文字:1
+ $a=3
+ ~~~~
    + CategoryInfo          : WriteError: (a:String) [], SessionStateUnauthorizedAccessException
    + FullyQualifiedErrorId : VariableNotWritable

PS C:\Users\taku>

定数削除
-Option ReadOnlyで定数にするとRemove-Item(エイリアス rv)で削除する場合は-Forceが必要になります。

PS C:\Users\taku> rv a -force
PS C:\Users\taku> $a
PS C:\Users\taku>

-Forceを使用しなかった場合はこのようにメッセージが表示されます。

PS C:\Users\taku> rv a
rv : 変数 a は定数または読み取り専用であるため、削除できません。変数が読み取り専用である場合は、Force オプションを指定
して操作を再試行してください。
発生場所 行:1 文字:1
+ rv a
+ ~~~~
    + CategoryInfo          : WriteError: (a:String) [Remove-Variable], SessionStateUnauthorizedAccessException
    + FullyQualifiedErrorId : VariableNotRemovable,Microsoft.PowerShell.Commands.RemoveVariableCommand

PS C:\Users\taku>

リテラル(16進/指数/単位/文字列)

数値
数値を直接入力すると、コマンドではなく数値として評価(計算)された結果が表示されます。

PS C:¥Users¥takk> 10
10
PS C:¥Users¥takk>

計算結果が表示されるので、電卓代わりに使うこともできます。

PS C:¥Users¥takk> 10 + 20 * 3
70
PS C:¥Users¥takk>

16進数
0xをつけると16進数を表現できます。

PS C:\Users\takk> $a=0x20
PS C:\Users\takk> echo $a
32
PS C:\Users\takk>

指数
指数表記。

PS C:\Users\takk> $a=1.23e3
PS C:\Users\takk> echo $a
1230
PS C:\Users\takk>

単位

PS C:\Users\takk> 1KB
1024
PS C:\Users\takk> 1MB, 1GB, 1TB
1048576
1073741824
1099511627776
PS C:\Users\takk>

文字列
文字列は、シングルまたはダブルクォートで囲みます.’文字列’ ”文字列”

PS C:\Users\takk> $a='HELLO'
PS C:\Users\takk> echo $a
HELLO
PS C:\Users\takk> $a="HELLO"
PS C:\Users\takk> echo $a
HELLO
PS C:\Users\takk>

変数名だけ書くと、内容が表示されます。Lengthは文字列長を取得できます。

PS C:\Users\takk> $a='HELLO'
PS C:\Users\takk> $a
HELLO
PS C:\Users\takk> $a.Length
5
PS C:\Users\takk>

Countは1が返ります。

PS C:\Users\takk> $a.Count
1
PS C:\Users\takk>

特殊な文字(改行/タブ/クォート/BS)

改行
`n (バッククォート・エヌ)で、改行できます。

PS C:\Users\takk> echo "HELLO1`nHELLO2"
HELLO1
HELLO2
PS C:\Users\takk>

タブ
`t (バッククォート・ティー)で、タブが指定できます。

PS C:\Users\takk> echo "HELLO1`tHELLO2"
HELLO1  HELLO2
PS C:\Users\takk>

シングルクォーテーション
シングルクォーテーションは、`’で指定できます。

PS C:\Users\takk> echo "HELLO1 `'HELLO2`'"
HELLO1 'HELLO2'
PS C:\Users\takk>

ダブルクォーテーション
ダブルクォーテーションは、`”で指定できます。

PS C:\Users\takk> echo "HELLO1 `"HELLO2`""
HELLO1 "HELLO2"
PS C:\Users\takk>

バッククォート
バッククォートを指定するには、“です。

PS C:\Users\takk> echo "HELLO1 ``HELLO2``"
HELLO1 `HELLO2`
PS C:\Users\takk>

バックスペース
バックスペースは、`bです。

PS C:\Users\takk> echo "HELLO1`b2"
HELLO2
PS C:\Users\takk>

配列(定義/追加/参照/初期化)

配列定義
(値,値,値…)で配列定義します。

PS C:\Users\takk> $a=(10,20,30)
PS C:\Users\takk> $a
10
20
30
PS C:\Users\takk>

,(カンマ)で区切るだけでもOKです。

PS C:\Users\takk> $a=10,20,30
PS C:\Users\takk> echo $a
10
20
30
PS C:\Users\takk> echo $a[1]
20
PS C:\Users\takk>

配列要素の追加
配列変数 += 値、で配列末尾に要素を追加できます。

PS C:\Users\takk> $a
10
20
30
PS C:\Users\takk>
PS C:\Users\takk> $a += 40
PS C:\Users\takk> $a
10
20
30
40
PS C:\Users\takk>

配列要素の参照

PS C:\Users\takk> $a[0,2]
10
30
PS C:\Users\takk>
PS C:\Users\takk> $a[0..2]
10
20
30
PS C:\Users\takk>

配列変数の内容を書き換えるには代入するだけです。

PS C:\Users\takk> $a=$a[0,3]
PS C:\Users\takk> $a
10
40
PS C:\Users\takk>

初期化は、配列変数=@()。

PS C:\Users\takk> $a=@()
PS C:\Users\takk>

変数自体を削除するには、コマンドレットを使います。

PS C:\Users\takk> clear-variable a
PS C:\Users\takk> $a
PS C:\Users\takk>

関数

関数はfunctionで定義します。変数$aと関数aは区別されます。

PS C:\Users\takk> function a(){
>> echo "Hello World"
>> }
>>
PS C:\Users\takk> a
Hello World
PS C:\Users\takk>

引数と戻り値付きの関数
引数、戻り値もちゃんと使えます。

PS C:\Users\takk> function b($in1, $in2){
>> $out = $in1 * $in2
>> return $out
>> }
PS C:\Users\takk> b 3 5
15
PS C:\Users\takk>

Automatic変数($^/$$/$HOME/$_/$?/$Args)

自動的に値が格納される変数です。

$^
$^には、前回実行した1番目の文字列が格納されます。
変数だから$から始まるのは分かるけど、^ってなんだか見慣れないマークで覚えにくいなあと思った方。正規表現を学ぶと良いかもしれません。日常的に正規表現を使ってるとむしろ^マークって覚えやすいですよね。

PS C:\Users\taku> echo AA BB CC DD
AA
BB
CC
DD
PS C:\Users\taku> echo $^
echo
PS C:\Users\taku>

$$
$$は、前回実行したコマンドの最後の文字列が格納されます。

PS C:\Users\taku> echo AA BB CC DD
AA
BB
CC
DD
PS C:\Users\taku> echo $$
DD
PS C:\Users\taku>

$HOME
$HOMEには、ホームディレクトリが格納されています。

PS C:\Users\taku> echo $HOME
C:\Users\taku
PS C:\Users\taku>

$_
$_は、現在のオブジェクトです。

PS C:\Users\taku> 1..5 | % { echo $_ }
1
2
3
4
5
PS C:\Users\taku>

$?
$?は、前回のコマンドの実行結果(TrueかFalse)が格納されます。
Trueのケース

PS C:\Users\taku> 1 + 3
4
PS C:\Users\taku> echo $?
True
PS C:\Users\taku>

Falseのケース

PS C:\Users\taku> 1 / 0
0 で除算しようとしました。
発生場所 行:1 文字:1
+ 1 / 0
+ ~~~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

PS C:\Users\taku> echo $?
False
PS C:\Users\taku>

$Args
$Argsには、引数が格納されます。

PS C:\Users\taku> function AA{
>> echo $args
>> }
PS C:\Users\taku> AA 1 2 3
1
2
3
PS C:\Users\taku>

0始まりです。

PS C:\Users\taku> function AA{
>> echo $args[1]
>> }
PS C:\Users\taku> AA 1 2 3
2
PS C:\Users\taku>

その他
$NULL $True $False
$NULLはNULLです。

PS C:\Users\taku> echo $NULL
PS C:\Users\taku>

$Trueは、True

PS C:\Users\taku> echo $true
True
PS C:\Users\taku>

$Falseは、これもそのまんま、False

PS C:\Users\taku> echo $false
False
PS C:\Users\taku>

プロンプト変更

プロンプトを変更するには、prompt関数を定義します。

PS C:\Users\taku> function prompt {
>> "PS takk >"
>> }
PS takk >

PS1ファイルが実行できないとき

ps1という拡張子を付けたテキストファイルにPowerShellのスクリプトを記述しておけば、実行できるようになりますが、
以下のように実行に失敗する場合、

Get-ExecutionPolicyを確認してみてください。
以下のようにRestricted(スクリプト実行不可)になっていたり、AllSigned(すべてのps1に要署名)になっている場合は、実行できません。

管理者でPowerShellを実行して実行ポリシーを変更します。

PowerShellが起動したら、Set-ExecutionPolicy RemoteSigned実行

「はい」を選択します。

別途PowerShellを起動してGet-ExecutionPolicyを実行すると、RemoteSignedが確認できます。

即席でps1ファイルを作って実行してみてください。
実行するにはパスを明確にしないといけません。.¥がファイル名の頭に必要です。

4.PowerShell 制御

分岐 if

if(式){
TRUE処理
}else{
FALSE処理
}

他言語と同じくifで分岐制御できます。

$aが1のときは、ONEと表示。それ以外のときは、NOT ONEと表示する関数aを作って確認してみましょう。

PS C:\Users\takk> function a(){
>> if ($a -eq 1){
>> echo "ONE"
>> }else{
>> echo "NOT ONE"
>> }
>> }
>>
PS C:\Users\takk> $a=2
PS C:\Users\takk> a
NOT ONE
PS C:\Users\takk> $a=1
PS C:\Users\takk> a
ONE
PS C:\Users\takk>

分岐判定に使う比較演算子

PowerShellの比較演算子はtestコマンドと合わせてあるので覚えやすいです。

-eq Equal to
-ne Not Equal to
-gt Greater Than
-ge Greater than or Equal to
-lt Less Than
-le Less than or Equal to

使ってみます。

PS C:\Users\takk> 3 -eq 5
False
PS C:\Users\takk> 3 -ne 5
True
PS C:\Users\takk> 3 -gt 5
False
PS C:\Users\takk> 3 -ge 5
False
PS C:\Users\takk> 3 -lt 5
True
PS C:\Users\takk> 3 -le 5
True
PS C:\Users\takk>

真偽が逆にあるように値を変えます。

PS C:\Users\takk> 3 -eq 3
True
PS C:\Users\takk> 3 -ne 3
False
PS C:\Users\takk> 3 -gt 3
False
PS C:\Users\takk> 3 -ge 3
True
PS C:\Users\takk> 3 -lt 3
False
PS C:\Users\takk> 3 -le 3
True
PS C:\Users\takk>

文字列にも使えます。eqにiが付くと大文字小文字無視します。
eqにcがつくと大文字小文字を区別します。

PS C:\Users\takk> "HELLO" -eq "hello"
True
PS C:\Users\takk> "HELLO" -ceq "hello"
False
PS C:\Users\takk> "HELLO" -ieq "hello"
True
PS C:\Users\takk> "HELLO" -ceq "HELLO"
True
PS C:\Users\takk>

真偽逆のパターン。

PS C:\Users\takk> "HELLO" -ne "hello"
False
PS C:\Users\takk> "HELLO" -cne "hello"
True
PS C:\Users\takk> "HELLO" -ine "hello"
False
PS C:\Users\takk> "HELLO" -cne "HELLO"
False
PS C:\Users\takk>

繰り返し for foreach

forとforeachを使います。

forの文法は、

for(初期化式;条件式;加減式){
処理
}

です。使ってみましょう。

PS C:\Users\takk> for($i=0;$i -lt 3; $i++){echo $i}
0
1
2
PS C:\Users\takk>

コマンドラインとして <や>と混同しないためでしょうか。
<を-ltと書く必要があります。

次は、foreachです。文法は、

foreach(変数 in 配列){
処理
}

です。

PS C:\Users\takk> $arr = 1,2,3
PS C:\Users\takk> foreach($a in $arr){
>> echo $a
>> }
>>
1
2
3
PS C:\Users\takk>

inに指定する配列の代わりに直接値を記述できます。

PS C:\Users\takk> foreach($a in 1,2,3){echo $a}
1
2
3
PS C:\Users\takk>

配列は、..で数列にすることもできますので、このようにも書けます。

PS C:\Users\takk> foreach($a in 1..3){echo $a}
1
2
3
PS C:\Users\takk>

他にもdoとかwhileとかの繰り返し構文あります。

では、 0~255までを16進で1行16桁で表示してみましょう。

foreach($i in 0..255){
  $s += "{0:X2} " -f $i
  if($i % 16 -eq 15){$s += "`r`n"}
}


echoすると毎回改行されてしまいますので、大きな文字列を作成した後、最後に一回でechoしています。

スクリプトブロック begin process end

PerlやAwkと同じように{}を使って制御文のブロックが指定できます。
起動時1回だけ実行するbeginブロック。各行を処理するprocessブロック。最後に1回だけ実行するendブロックです。
使ってみましょう。

PS C:\Users\takk> function tohex(){
>> begin{$s=""}
>> process{$s += "{0:X2} " -f $_}
>> end{echo $s}
>> }
>>
PS C:\Users\takk> 10,20,30,40,50 | tohex
0A 14 1E 28 32
PS C:\Users\takk>

次は、lsの結果を渡してみましょう。

PS C:\Users\takk\aaa> ls -n
dir_11CFDF63
dir_2065207
dir_2EA62317
dir_3A7F5143
dir_46585CA
dir_59E634FB
dir_5D8B7032
dir_60682448
dir_6604792F
dir_6A254AAD
dir_7E2D24B5
PS C:\Users\takk\aaa>

18桁の右詰表示に加工する関数です。

PS C:\Users\takk\aaa> function print20(){
>> process{"|{0,18}|" -f $_}
>> }
>>
PS C:\Users\takk\aaa> ls -n | print20
|      dir_11CFDF63|
|       dir_2065207|
|      dir_2EA62317|
|      dir_3A7F5143|
|       dir_46585CA|
|      dir_59E634FB|
|      dir_5D8B7032|
|      dir_60682448|
|      dir_6604792F|
|      dir_6A254AAD|
|      dir_7E2D24B5|
PS C:\Users\takk\aaa>

foreach (ForEach-Object)とスクリプトブロック

すでに説明したforeachは、ForEach-Objectのエイリアスです。
さらに詳しく見ていきましょう。

PS C:\Users\takk> get-alias foreach

CommandType     Name                                               ModuleName
-----------     ----                                               ----------
Alias           foreach -> ForEach-Object


PS C:\Users\takk>

こんな風に使ってました。

PS C:\Users\takk> foreach($i in 1,2,3){echo $i}
1
2
3
PS C:\Users\takk>

1,2,3はパイプで渡すこともできます。その際、各行の文字列は、$_に格納されています。

PS C:\Users\takk> 1,2,3 | foreach{echo $_}
1
2
3
PS C:\Users\takk>

ForEach-Objectはforeachの他にも%がエイリアスされています。

PS C:\Users\takk> 1,2,3 | %{echo $_}
1
2
3
PS C:\Users\takk>

-Begin -Process -Endブロックが指定できます。

PS C:\Users\takk> 1,2,3 | % -Begin{echo "BEGIN"} -Process{echo $_} -End{echo "END"}
BEGIN
1
2
3
END
PS C:\Users\takk>

そして -Begin -Process -Endは{}を残して省略もできます。

PS C:\Users\takk> 1,2,3 | % {echo "BEGIN"} {echo $_} {echo "END"}
BEGIN
1
2
3
END
PS C:\Users\takk> 1,2,3 | %{echo "BEGIN"}{echo $_}{echo "END"}
BEGIN
1
2
3
END
PS C:\Users\takk>

16進16桁表示はこのように書くこともできます。

0..255 | %{$s=""}{$s += "{0:X2} " -f $_;if($_%16 -eq 15){$s+="`n"}}{echo $s}

文字列操作 置換、分割、長さ、位置取得、パディング他

文字列置換。Replaceメソッドの場合。

PS C:\Users\taku> $s  = "ABCDEFG"
PS C:\Users\taku> $s.replace("CDE","*****")
AB*****FG
PS C:\Users\taku>

Replaceメソッドは正規表現が使えません。

PS C:\Users\taku> $s.replace("A.*E","*****")
ABCDEFG
PS C:\Users\taku>

正規表現を使う場合は、-Replaceを使います。

PS C:\Users\taku> $s  = "ABCDEFG"
PS C:\Users\taku> $s.replace("A.*E","*****")
*****FG
PS C:\Users\taku>
PS C:\Users\takk> $s="HELLO"
PS C:\Users\takk> $s-replace("L","E")
HEEEO
PS C:\Users\takk>

文字列分割。
Splitメソッドの引数にセパレータを指定します。

PS C:\Users\takk> $a="192.168.1.10"
PS C:\Users\takk> $a.Split(".")[1]
168
PS C:\Users\takk>

-Splitの場合。

PS C:\Users\takk> "aa bb cc dd"-split " "
aa
bb
cc
dd
PS C:\Users\takk>
PS C:\Users\takk> $a="192.168.1.10"
PS C:\Users\takk> ($a-Split("\."))[1]
168
PS C:\Users\takk>

関連記事はコチラ
ファイルパスと行番号から該当行抽出(PowerShell)

文字列長の取得。Lengthを使います。

PS C:\Users\taku> $s  = "ABCDEFG"
PS C:\Users\taku> $s.length
7
PS C:\Users\taku>

混同しやすいCountですが、配列要素数なので、この場合は1になります。

PS C:\Users\taku> $s.count
1
PS C:\Users\taku>

特定文字列を含んでいるか。

PS C:\Users\taku> $s  = "ABCDEFG"
PS C:\Users\taku> $s.contains("CD")
True
PS C:\Users\taku> $s.contains("CBD")
False
PS C:\Users\taku>

正規表現は使えません。

PS C:\Users\taku> $s.contains("C.*D")
False
PS C:\Users\taku>

文字列内の文字列の位置を取得するには、IndexOf、LastIndexOfメソッドを使います。

PS C:\Users\taku> $s = "ABCD ABCD ABCD"
PS C:\Users\taku> $s.indexof("AB")
0
PS C:\Users\taku> $s.indexof("AB",0)
0
PS C:\Users\taku> $s.indexof("AB",1)
5
PS C:\Users\taku> $s.indexof("AB",5)
5
PS C:\Users\taku> $s.indexof("AB",6)
10
PS C:\Users\taku> $s.lastindexof("AB")
10
PS C:\Users\taku>

PadLeft、PadRightは、文字列のパディングするメソッドです。

PS C:\Users\taku> $s="ABCD"
PS C:\Users\taku> $s.padleft(10)
      ABCD
PS C:\Users\taku> $s.padleft(10,"*")
******ABCD
PS C:\Users\taku> $s.padleft(3,"*")
ABCD
PS C:\Users\taku>
PS C:\Users\taku> $s.padright(10)
ABCD
PS C:\Users\taku> $s.padright(10,"*")
ABCD******
PS C:\Users\taku> $s.padright(3,"*")
ABCD
PS C:\Users\taku>

配列操作

PowerShellで分かっていそうで分かっていない配列。おさらいしてみます。
まず連番の生成から。1~5の整数を作ります。

PS C:\Users\takk> $arr=1..5
PS C:\Users\takk> $arr
1
2
3
4
5
PS C:\Users\takk>

負の数も作れます。

PS C:\Users\takk> $arr=-3..2
PS C:\Users\takk> $arr
-3
-2
-1
0
1
2
PS C:\Users\takk>

配列数を取得するには、Countです。

PS C:\Users\takk> $arr.Count
6
PS C:\Users\takk>

カンマで区切って配列を作成。

PS C:\Users\takk> $arr=10,-20,30,-40,50,-60
PS C:\Users\takk> $arr
10
-20
30
-40
50
-60
PS C:\Users\takk>

比較演算子でフィルタリングもできます。

PS C:\Users\takk> $arr -gt 0
10
30
50
PS C:\Users\takk> $arr -lt 0
-20
-40
-60
PS C:\Users\takk>

変数の値自体を変えるには、変数へ再代入するだけです。

PS C:\Users\takk> $arr2 = $arr -gt 0
PS C:\Users\takk> $arr2 = $arr2 -gt 10
PS C:\Users\takk> $arr2
30
50
PS C:\Users\takk>

一致しない値を抽出。

PS C:\Users\takk> $arr -ne 30
10
-20
-40
50
-60
PS C:\Users\takk>

条件を増やして抽出。

PS C:\Users\takk> $arr -ne 30 -ne 50 -ne -40
10
-20
-60
PS C:\Users\takk>

配列を繰り返し。

PS C:\Users\takk> $arr * 2
10
-20
30
-40
50
-60
10
-20
30
-40
50
-60
PS C:\Users\takk>

文字列にも使えます。

PS C:\Users\takk> "HELLO" * 10
HELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLO
PS C:\Users\takk>

奇数を抽出。

PS C:\Users\takk> $arr=1..20
PS C:\Users\takk> ($arr | %{$_*($_%2)}) -ne 0
1
3
5
7
9
11
13
15
17
19
PS C:\Users\takk>

偶数。

PS C:\Users\takk> ($arr | %{$_*(1-$_%2)}) -ne 0
2
4
6
8
10
12
14
16
18
20
PS C:\Users\takk>

コマンド置換 コマンド実行結果を使う

コマンド置換は、bashのように$()で囲みます。

PS C:\Users\takk> "{0:X}" -f $(get-random)
246955EC
PS C:\Users\takk>

コマンド置換はネストもできます。

0..10 |% {mkdir $("dir_{0:X}" -f $(get-random)) | out-null}

フィルタ filter

フィルタをつかってみます。オブジェクトをフィルタする場合は、%(ForEach-Object)を使いますが、

PS C:\Users\takk\aaa> 1..10 | %{$_*$_}
1
4
9
16
25
36
49
64
81
100
PS C:\Users\takk\aaa>

これを関数化するには、filterを使います。

PS C:\Users\takk\aaa> filter squre(){
>> $_*$_
>> }
>>
PS C:\Users\takk\aaa> 1..10 | squre
1
4
9
16
25
36
49
64
81
100
PS C:\Users\takk\aaa>

始めと終わりの処理をしたい時は、%を使う場合は、{}を3つ置きます。

PS C:\Users\takk\aaa> 1..10 | %{$sum=0}{$sum+=$_}{$sum}
55
PS C:\Users\takk\aaa>

この3つの{}は、単にBegin/Process/Endの指定を省略しているだけです。

PS C:\Users\takk\aaa> 1..10 | % -Begin{$sum=0} -Process{$sum+=$_} -End{$sum}
55
PS C:\Users\takk\aaa>

ですので、filterを使う場合は、Begin/Process/Endブロックそれぞれの中に必要な処理を書けばよいです。

PS C:\Users\takk\aaa> filter sum(){
>> begin{$sum=0}
>> process{$sum += $_}
>> end{$sum}
>> }
>>
PS C:\Users\takk\aaa> 1..10 | sum
55
PS C:\Users\takk\aaa>

出力を捨てる out-null

PowerShellでディレクトリを作成しようとすると、ディレクトリ作成だけでなく、親切にもたくさんのメッセージを表示してくれます。

PS C:\Users\takk\aaa> mkdir a


    ディレクトリ: C:\Users\takk\aaa


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2017/06/28     21:19            a


PS C:\Users\takk\aaa>

これはこれで良いのですが、とてもかさばります。
メッセージを表示しないようにするには、out-nullへパイプで渡します。

PS C:\Users\takk\aaa> mkdir b | out-null
PS C:\Users\takk\aaa> ls -n
a
b
PS C:\Users\takk\aaa>

PowerShellとcmdと連携

PowerShellとcmd(コマンドプロンプト)の連携をします。

PowerShellは、繰り返し処理が簡潔に書けます。
1~10の連番の生成は、5文字書くだけです。

C:\Users\takk> 1..10

しかしcmd(コマンドプロンプト)では、同じようには書けません。

C:\Users\takk> 1..10


この通り、エラーとなります。

cmdから1~10の連番を作るには、forコマンドを使います。

C:\Users\takk> for /l %i in (1,1,10);do @echo %i


このようにforコマンドは使い方が難しいです。代わりにコマンドプロンプトからPowerShellを呼び出ししてみましょう。powershellのコマンドを実行して結果を得るには、-Cオプションを使います。

C:\Users\takk>powershell -C 1..10

5.PowerShell 各コマンドレット

Get-ChildItem (ls gci dir) 一覧表示

Get-ChildItem [[-Path] <string[]>] [[-Filter] <string>] [<CommonParameters>]
Get-ChildItem [[-Filter] <string>] [<CommonParameters>]

指定ディレクトリのファイルとディレクトリ一覧を表示します。

lsコマンドは、元々はUnixで使われていたコマンドで、ただファイル名を表示する仕様が美しかったのですが、PowerShellのlsはなんだか情報が多いですね。

-Name 名前のみ

Get-ChildItemに-Nameを指定すれば、ファイル名、ディレクトリ名のみ表示することができます。
大文字小文字は区別しませんので、ls -nameでよいです。

ls -name


-nameオプションは長くて打つのが面倒だというなら、さらに省略して-nでも良いです。

ls -n

-Recurse 再起的に取得

Linux(Unix)のfindコマンドのようにディレクトリ階層を追ってすべて表示する場合は、-Recurseオプションを使います。-rでよいです。-n(-Name)も併用します。
ディレクトリだけでなく、ファイルも一覧に表示されます。

ls -n -r

-Directory ディレクトリのみ

ディレクトリのみに限定する場合は、-Directoryオプション(-di)を使います。

ls -n -r -di

-File ファイルのみ

ファイルのみの絞り込みは、-Fileオプションでできますが、-F等に省略不可です。

ls -n -r -File

Get-Item (gi) ファイル表示

Get-Item [-Path] <string[]> [<CommonParameters>]
Get-Item [<CommonParameters>]

Get-ChildItemってコマンドレットがあるってことは、当然Get-Itemってコマンドレットもあり、Childがついてないってことは、指定した項目そのものの情報を表示するってことです。

このディレクトリ構成で確認します。

tree

Get-Item(gi)でディレクトリを指定。

gi dir1


どこかでみたことのある情報が出力されました。

一方、Get-ContentItem(ls)でディレクトリを指定すると、

ls dir1


Get-Item(gi)が、ディレクトリの表側が確認できたことに対して、Get-ChildItem(ls)では、ディレクトリの内側が確認できました。

Get-Itemでプロパティ取得

Get-FileやGet-Directoryではなく、わざわざGet-Itemというコマンドレット名なのには理由があります。
単にファイル名やディレクトリ名を取得するだけではないからです。
プロパティを取得してみましょう。

更新日時を表示。

(gi dir1).LastAccessTime


親ディレクトリを表示。

(gi dir1).Parent


Get-Itemの戻り値がオブジェクトなので、プロパティを取得するには、.(ドット)を使ってプロパティ名を指定してやればいいだけです。

どのようなプロパティがあるかというと、以下のようにGet-Memberを使えばわかります。

gi dir1 | get-member

New-Item (mkdir) ディレクトリ作成

New-Item [-Path] <string[]> [<CommonParameters>]
New-Item [[-Path] <string[]>] [<CommonParameters>]

ディレクトリを作ってみましょう。mkdirが使えます。New-Itemコマンドレットのエイリアスです。

PS C:\Users\takk> mkdir aaa


    ディレクトリ: C:\Users\takk


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2017/06/26     20:25            aaa


PS C:\Users\takk>

多階層のディレクトリでも一回で作成することができます。

PS C:\Users\takk\aaa> ls
PS C:\Users\takk\aaa> mkdir dir1/dir2/dir3 | out-null
PS C:\Users\takk\aaa> ls -n -r
dir1
dir1\dir2
dir1\dir2\dir3
PS C:\Users\takk\aaa>

Set-Location (cd) ディレクトリ変更

Set-Location [[-Path] <string>] [<CommonParameters>]
Set-Location [<CommonParameters>]

cdでカレントディレクトリを変更できます。

PS C:\Users\takk> cd aaa
PS C:\Users\takk\aaa>

ls(Get-ChildItem)でディレクトリ内にファイルがあるか確認してみます。

PS C:\Users\takk\aaa> ls
PS C:\Users\takk\aaa>

空ですね。
ファイルを作ってみます。Linuxと同じくリダイレクトできます。

PS C:\Users\takk\aaa> echo HELLO > file1

ファイルが作成されたか確認します。

PS C:\Users\takk\aaa> ls -n
file1
PS C:\Users\takk\aaa>

親ディレクトリへ

cd ..で、一つ上のディレクトリに変更します。

PS C:\Users\takk\aaa\0\1\2\3\4\5\6\7\8\9> cd ..
PS C:\Users\takk\aaa\0\1\2\3\4\5\6\7\8>

ホームディレクトリへ

ホームディレクトリへ戻るには、cdに指定するパスを~にします。

PS C:\Users\takk\aaa\0\1\2\3\4\5\6\7\8> cd ~
PS C:\Users\takk>

Get-Content (gc cat) テキスト内容表示

Get-Content [-Path] <string[]> [<CommonParameters>]
Get-Content [<CommonParameters>]

本コマンドでファイルの内容が確認できます。

PS C:\Users\takk> cat file1
HELLO
PS C:\Users\takk>

関連記事はコチラ
PowerShellでファイルダンプコマンドを作る

Set-Content (sc) 内容書き込み

Set-Content [-Path] <string[]> [-Value] <Object[]> [<CommonParameters>]
Set-Content [-Value] <Object[]> [<CommonParameters>]

テキスト

PS C:\Users\takk> sc a.txt HELLO
PS C:\Users\takk> cat a.txt
HELLO
PS C:\Users\takk>

バイナリデータ

PS C:\Users\takk> [byte[]]$a=0x41,0x42,0x43,0x44,0x45
PS C:\Users\takk> sc -encoding byte a.bin $a
PS C:\Users\takk> cat a.bin
ABCDE
PS C:\Users\takk>

Move-Item (mv) ファイル名変更

Move-Item [-Path] <string[]> [[-Destination] <string>] [<CommonParameters>]
Move-Item [[-Destination] <string>] [<CommonParameters>]

mvでファイル名が変更できます。

PS C:\Users\takk\aaa> mv file1 file2
PS C:\Users\takk\aaa> ls -n
file2
PS C:\Users\takk\aaa>

Remove-Item (rm) ファイル削除

Remove-Item [-Path] <string[]> [<CommonParameters>]
Remove-Item [<CommonParameters>]

ファイルの削除コマンドです。

PS C:\Users\takk\aaa> rm file2
PS C:\Users\takk\aaa> ls
PS C:\Users\takk\aaa>

Join-Path パスの結合

Join-Path [-Path] <string[]> [ChildPath] <string> [<CommonParameters>]

実際にあるパスじゃなくてもよいです。

PS C:\Users\taku> join-path c:\aa bb.txt
c:\aa\bb.txt
PS C:\Users\taku>

Convert-Path 絶対パスへ変換

Convert-Path [-Path] <string[]> [<CommonParameters>]
Convert-Path [<CommonParameters>]

相対パス文字列を絶対パスに変換します。
以下ではa.txtは相対パスで表示されています。

PS C:\Users\taku\tmp> ls -n
a.txt
PS C:\Users\taku\tmp>

これをconvert-pathにかけると、絶対パスに変換されます。

PS C:\Users\taku\tmp> ls -n | convert-path
C:\Users\taku\tmp\a.txt
PS C:\Users\taku\tmp>

Get-Random 乱数

Get-Random [[-Maximum] <Object>] [<CommonParameters>]
Get-Random [-InputObject] <Object[]> [<CommonParameters>]

乱数が取得できるコマンドです。

引数を指定すると、0~(引数に指定した数-1)の乱数を取得できます。

Compress-Archive ZIP圧縮

Compress-Archive [-Path] <string[]> [-DestinationPath] <string> [<CommonParameters>]
Compress-Archive [-DestinationPath] <string> [<CommonParameters>]

ファイルをZIP圧縮するコマンドです。

適当にファイル作成しておいて、

PS C:\Users\taku\Desktop> cmd /c echo HELLO> test.txt
PS C:\Users\taku\Desktop> ls


    ディレクトリ: C:\Users\taku\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/04/03     11:23              7 test.txt


PS C:\Users\taku\Desktop>

7バイトのファイルができました。これを圧縮します。

ZIP圧縮するにはCompress-Archiveコマンドレットを使います。
-Pathオプション 圧縮するファイル名
-DestnationPath ZIPファイル名
を指定して実行します。

PS C:\Users\taku\Desktop> compress-archive -path test.txt -destinationpath a.zip
PS C:\Users\taku\Desktop> ls

    ディレクトリ: C:\Users\taku\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/04/03     11:38            123 a.zip
-a----       2020/04/03     11:23              7 test.txt


PS C:\Users\taku\Desktop>

test.txtは7バイトなのに、圧縮したa.zipは123バイトになってしまいました。
ちょっと例が悪かったですね。もう少しサイズの大きいファイルにしてみます。

PS C:\Users\taku\Desktop> ls
PS C:\Users\taku\Desktop> 1..1000>test.txt
PS C:\Users\taku\Desktop> ls


    ディレクトリ: C:\Users\taku\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/04/03     11:54           9788 test.txt


PS C:\Users\taku\Desktop> compress-archive test.txt -dest a.zip                                    PS C:\Users\taku\Desktop> ls
PS C:\Users\taku\Desktop> ls


    ディレクトリ: C:\Users\taku\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/04/03     11:54           1940 a.zip
-a----       2020/04/03     11:54           9788 test.txt


PS C:\Users\taku\Desktop>

test.txtは9788バイト、圧縮したa.zipは1940バイトになりました。

Expand-Archive ZIP解凍

Expand-Archive [-Path] <string> [[-DestinationPath] <string>] [<CommonParameters>]
Expand-Archive [[-DestinationPath] <string>] [<CommonParameters>]

ZIPファイルを解凍するには、Expand-Archiveを使います。

-Pathオプション 解凍対象のZIPファイル(省略できます)
-DestinationPath 解凍先フォルダ

Compress-Archiveで作成したZIPファイルを解凍してみましょう。

-a----       2020/04/03     11:54           1940 a.zip
-a----       2020/04/03     11:54           9788 test.txt

test.txtが圧縮前のファイルで、a.zipが圧縮したファイルです。
a.zipをnewフォルダに解凍します。

PS C:\Users\taku\Desktop> expand-archive a.zip -dest new
PS C:\Users\taku\Desktop> ls


    ディレクトリ: C:\Users\taku\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2020/04/03     12:03                new
-a----       2020/04/03     11:54           1940 a.zip
-a----       2020/04/03     11:54           9788 test.txt


PS C:\Users\taku\Desktop>

newの中身をみてみます。

PS C:\Users\taku\Desktop> ls new


    ディレクトリ: C:\Users\taku\Desktop\new


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/04/03     11:54           9788 test.txt


PS C:\Users\taku\Desktop>

解凍されてますね。

次はカレントディレクトリへ解凍してみたいと思います。
次は元々あったtest.txtファイルを消した状態にしておきます。

PS C:\Users\taku\Desktop> ls


    ディレクトリ: C:\Users\taku\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/04/03     11:54           1940 a.zip


PS C:\Users\taku\Desktop>

-DestinationPathには、.(ドット)を指定します。

PS C:\Users\taku\Desktop> expand-archive a.zip -dest .
PS C:\Users\taku\Desktop> ls


    ディレクトリ: C:\Users\taku\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/04/03     11:54           1940 a.zip
-a----       2020/04/03     11:54           9788 test.txt


PS C:\Users\taku\Desktop>

カレントディレクトリにtest.txtが解凍されました。

Select-String (sls) 文字列検索

Select-String [-Pattern] <string[]> [-Path] <string[]> [<CommonParameters>]
Select-String [-Pattern] <string[]> [<CommonParameters>]

このコマンドレットでgrepができます。エイリアスはslsです。
まずは検索確認用データを作っておきます。

PS C:\Users\taku\Desktop> $r=1..5 | %{ get-random }
PS C:\Users\taku\Desktop> $r
77073845
1633293137
2001234929
1166330771
1126975556
PS C:\Users\taku\Desktop>

では文字列の検索をしてみましょう。引数で指定した文字列がある行を表示してくれます。

PS C:\Users\taku\Desktop> $r | sls 00

2001234929


PS C:\Users\taku\Desktop>

正規表現も使えます。”で囲って指定しましょう。

PS C:\Users\taku\Desktop> $r | sls '6.*3'

1633293137
1166330771


PS C:\Users\taku\Desktop>

Get-FileHash ハッシュ値取得

Get-FileHash [-Path] <string[]> [<CommonParameters>]
Get-FileHash [<CommonParameters>]

PowerShellでファイルのハッシュ値を求めてみます。このようなファイルがあるとき、

PS C:\Users\takk\aaa> ls -name -re -i *.txt
12\74\06\63\23\file_1.txt
14\53\23\53\43\file_2.txt
14\92\16\14\68\file_3.txt
20\20\97\04\40\file_5.txt
57\93\43\76\7\file_6.txt
86\03\02\65\2\file_4.txt
PS C:\Users\takk\aaa>

Get-FileHashを使います。デフォルトではSHA256です。
各ファイルのSHA256の一覧を表示してみましょう。(lsはGet-ChildItemのエイリアス)

PS C:\Users\takk\aaa> ls -name -re -i *.txt | %{get-filehash $_}

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          D0BD5F8C7875E14A074D98511EED9C3D3BF720F0BDFD008D16052563D4EA94B8       C:\Users\takk\aaa\12\74\06\63...
SHA256          3345CCC61C3BBED900FE98F6431B0E1CDF0BE5EDF627733294FF988F8C43022E       C:\Users\takk\aaa\14\53\23\53...
SHA256          67C5758FEF35C0F828B76D20F10858DB3C42259C9641C4DB89FC5B455584E932       C:\Users\takk\aaa\14\92\16\14...
SHA256          B1CC89066A64CEC02B2D0163C88B4613BB936F5B7DBEF54E1A596B56D3F43D30       C:\Users\takk\aaa\20\20\97\04...
SHA256          2363F9D309044538D5F6958A2D4F05A14E19A02A05E92E16165F2FAF721D5B1F       C:\Users\takk\aaa\57\93\43\76...
SHA256          008E87DE25C15AB9A45324626E2258AF65A499D99C6569002760C6B5185C87A7       C:\Users\takk\aaa\86\03\02\65...

別のアルゴリズムを指定するには、-Algorithmオプションを使います。(-Aは略)ファイルのMD5を求めてみます。

PS C:\Users\takk\aaa> ls -name -re -i *.txt | %{get-filehash -A MD5 $_}

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
MD5             218F5179EBAB0BB65A054150FDF65580                                       C:\Users\takk\aaa\12\74\06\63...
MD5             2D39D9EBC71AF0B26E22094BA9E115E0                                       C:\Users\takk\aaa\14\53\23\53...
MD5             EEE6D8EFB87B0791D94D2DD59312A5D9                                       C:\Users\takk\aaa\14\92\16\14...
MD5             616EBF0371CD7B162FD6BB7C941ED8A1                                       C:\Users\takk\aaa\20\20\97\04...
MD5             7317684E8336F2B29F414B5E9AC4FE31                                       C:\Users\takk\aaa\57\93\43\76...
MD5             CFFF13625862792EA22A94437D8C20A8                                       C:\Users\takk\aaa\86\03\02\65...

関連記事はコチラ
<a href="https://life-is-command.com/powershell-uniq/">PowerShell(重複してない内容のファイルを抽出)</a>


PS C:\Users\takk\aaa>

その他のアルゴリズムも指定できます。

-Algorithm SHA1

PS C:\Users\takk\aaa> ls -name -re -i *.txt | %{get-filehash -A SHA1 $_}

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA1            D50AE4AFDEF5D8DDADE7ECE88184D07FA1ED96F2                               C:\Users\takk\aaa\12\74\06\63...
SHA1            7A1E424D949FD1FCED8582F7141F5A4926D06E5B                               C:\Users\takk\aaa\14\53\23\53...
SHA1            474C63E9FAB49BF8BCC9FCC947BC2B11B36EEBF6                               C:\Users\takk\aaa\14\92\16\14...
SHA1            FA8157FC68C63FB41B2465E011E01D9AD2AB5671                               C:\Users\takk\aaa\20\20\97\04...
SHA1            C2B24C5E23DC9B0C573F8E4E55780C8A9AE1B2E9                               C:\Users\takk\aaa\57\93\43\76...
SHA1            554B62A479ABE742C2E79CB3CCEC17F162BD6029                               C:\Users\takk\aaa\86\03\02\65...


PS C:\Users\takk\aaa>

-Algorithm SHA384

PS C:\Users\takk\aaa> ls -name -re -i *.txt | %{get-filehash -A SHA384 $_}

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA384          FDD204CCADA4615995B8C7CA39B10F5325D7FE18A4A85440373D7C2A83528C0C6A1... C:\Users\takk\aaa\12\74\06\63...
SHA384          FB2CE751A95120AC311C2C962240E804787E75831C4F5E1A3468FAA11BF69399A4B... C:\Users\takk\aaa\14\53\23\53...
SHA384          44875C31E0B8984CE357A0F8D8587DC3DFD5497FD96DF885A864AC645448D184473... C:\Users\takk\aaa\14\92\16\14...
SHA384          C2853017C46398CD63643C07FFC100790940996B05ED3E27F0F55E0197174F64EFC... C:\Users\takk\aaa\20\20\97\04...
SHA384          511B76D407CDC7D7291C332F0265CBE7528D4F0846072CE3D118A2B7302B0CFFFAE... C:\Users\takk\aaa\57\93\43\76...
SHA384          3EC69551AB36BD2C669DEA202E357F51E44A013EA881FC3D3A5F561583F60D19571... C:\Users\takk\aaa\86\03\02\65...


PS C:\Users\takk\aaa>

-Algorithm SHA512

PS C:\Users\takk\aaa> ls -name -re -i *.txt | %{get-filehash -A SHA512 $_}

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA512          A76783397DF47097AA4F26ED89F768476EA8BD40E8B1DFC01440BC5BC303738DAA3... C:\Users\takk\aaa\12\74\06\63...
SHA512          CCD17D9A7D5B6B305C73D034CD12C973696F173DEEA4E4F3D39859F30EB27912903... C:\Users\takk\aaa\14\53\23\53...
SHA512          A143A2FA355CE38E7D20C92A7E7B3F0121639539063E2328BF198F98534585F6E3D... C:\Users\takk\aaa\14\92\16\14...
SHA512          B0D0A0AD01CBF2AB99F678A61059F3ABEEE120B2E6F6B47F617F202A2EC6E151171... C:\Users\takk\aaa\20\20\97\04...
SHA512          FDAB0ED01617023A24B47958E143ECDE99845AEAEB92B463955CAEC896AA372BF77... C:\Users\takk\aaa\57\93\43\76...
SHA512          181D119A7924009FC102096E83FFD81C17E1A51CC981ADB4C7CE0D11EA244F98942... C:\Users\takk\aaa\86\03\02\65...


PS C:\Users\takk\aaa>

-Algorithm MACTripleDES

PS C:\Users\takk\aaa> ls -name -re -i *.txt | %{get-filehash -A MACTripleDES $_}

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
MACTRIPLEDES    FF8B3F61EA3009E6                                                       C:\Users\takk\aaa\12\74\06\63...
MACTRIPLEDES    25242A5795E6C6CF                                                       C:\Users\takk\aaa\14\53\23\53...
MACTRIPLEDES    A7065FAED6BCB0AC                                                       C:\Users\takk\aaa\14\92\16\14...
MACTRIPLEDES    A64D73AF42505439                                                       C:\Users\takk\aaa\20\20\97\04...
MACTRIPLEDES    E838F837F8CD47F0                                                       C:\Users\takk\aaa\57\93\43\76...
MACTRIPLEDES    A7E63E09109AF589                                                       C:\Users\takk\aaa\86\03\02\65...


PS C:\Users\takk\aaa>

-Algorithm RIPEMD160

PS C:\Users\takk\aaa> ls -name -re -i *.txt | %{get-filehash -A RIPEMD160 $_}

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
RIPEMD160       ECD4C2025F40781E1692221EF17F8B2C9C8BB19E                               C:\Users\takk\aaa\12\74\06\63...
RIPEMD160       36C0B12558F054486377E489ECC0373A8E239A8C                               C:\Users\takk\aaa\14\53\23\53...
RIPEMD160       F5C610EF7F1F1D31849EE4F00CA19E8D8E53D46B                               C:\Users\takk\aaa\14\92\16\14...
RIPEMD160       ECC87B539406FDE866CB47415B7096D85075C1D6                               C:\Users\takk\aaa\20\20\97\04...
RIPEMD160       C2A8BF874288DFD01275F70E5335B60EC5CB5FA6                               C:\Users\takk\aaa\57\93\43\76...
RIPEMD160       BD5D69D4BBF99F9A8B63B868A51C95BF76A01CE9                               C:\Users\takk\aaa\86\03\02\65...


PS C:\Users\takk\aaa>

Get-Date 日付時刻の取得、計算

Get-Date [[-Date] <datetime>] [<CommonParameters>]

現在日時の取得や、計算が行えます。

現在日時を取得する

PS C:\Users\takk> get-date

2017年8月18日 19:48:03


Get-DateのAddMonthsメソッドで、日付の加算ができます。

PS C:\Users\takk> (get-date).addMonths(1)

2017年9月18日 19:48:25


PS C:\Users\takk>

一カ月後の9月18日になってはいますが、さきほどは19:48:03だったのに、
今回は、19:48:25になっています。時間は刻々と過ぎていきますから仕方ありませんね。
一度変数に格納してからメソッドを使ってみましょう。

PS C:\Users\takk> $a=get-date
PS C:\Users\takk> $a

2017年8月18日 19:48:42


PS C:\Users\takk> $a.addMonths(1)

2017年9月18日 19:48:42


PS C:\Users\takk>

任意の日時で計算

現在日時ではなく、自由に決めたい場合は、Get-Dateの引数に日付や時刻を指定します。
では日付の指定をしてみます。

PS C:\Users\takk> get-date "2010/1/1"

2010年1月1日 0:00:00


PS C:\Users\takk>

次は日付と時刻。

PS C:\Users\takk> get-date "2010/1/1 10:00:00"

2010年1月1日 10:00:00


PS C:\Users\takk>

同じように変数に格納して、日付時刻を計算するメソッドを使うことができます。

PS C:\Users\takk> $a=get-date "2010/1/1 10:00:00"
PS C:\Users\takk> $a.addmonths(3)

2010年4月1日 10:00:00


PS C:\Users\takk>
PS C:\Users\takk> $a.adddays(100)

2010年4月11日 10:00:00


PS C:\Users\takk>

指定した2つの日付時刻の差分

差を求めるのは単純に引き算するだけです。

PS C:\Users\takk> $b=$a.adddays(100)
PS C:\Users\takk> $b

2010年4月11日 10:00:00


PS C:\Users\takk>

結果はいろんな単位で表示されます。これは結構便利です。

PS C:\Users\takk> $b - $a


Days              : 100
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 0
Ticks             : 86400000000000
TotalDays         : 100
TotalHours        : 2400
TotalMinutes      : 144000
TotalSeconds      : 8640000
TotalMilliseconds : 8640000000



PS C:\Users\takk>

Test-Path パス存在チェック

Test-Path [-Path] <string[]> [<CommonParameters>]
Test-Path [<CommonParameters>]

PS C:\Users\taku\tmp> ls


    ディレクトリ: C:\Users\taku\tmp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2020/05/21     21:17             16 a.txt


PS C:\Users\taku\tmp> test-path a.txt
True
PS C:\Users\taku\tmp> test-path b.txt
False
PS C:\Users\taku\tmp>

Where-Object

Where-Object [-Property] <string> [[-Value] <Object>] [<CommonParameters>]
Where-Object [-FilterScript] <scriptblock> [<CommonParameters>]

Where-Objectを使ってみます。省略形は、?です。

ForEach-Objectを使ってWhere-Objectを表現すると、

PS C:\Users\takk\aaa> 1..10 | %{if($_ % 2){$_}}
1
3
5
7
9
PS C:\Users\takk\aaa>

となります。

Where-Objectを使うと少しだけ短いコマンドラインとなります。

PS C:\Users\takk\aaa> 1..10 | ?{$_ % 2}
1
3
5
7
9
PS C:\Users\takk\aaa>

ファイル一覧に対して、Where-Objectを使ってみましょう。
実験ファイルを適当に作成します。

PS C:\Users\takk\aaa> 1..10 | %{$fname="file$_.txt";"HELLO" > $fname}

このようにファイルが10個できました。

PS C:\Users\takk\aaa> gci


    ディレクトリ: C:\Users\takk\aaa


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2017/07/30     23:27         16 file1.txt
-a---        2017/07/30     23:27         16 file10.txt
-a---        2017/07/30     23:27         16 file2.txt
-a---        2017/07/30     23:27         16 file3.txt
-a---        2017/07/30     23:27         16 file4.txt
-a---        2017/07/30     23:27         16 file5.txt
-a---        2017/07/30     23:27         16 file6.txt
-a---        2017/07/30     23:27         16 file7.txt
-a---        2017/07/30     23:27         16 file8.txt
-a---        2017/07/30     23:27         16 file9.txt

-likeを使って、10という文字列が含まれている行のみ抽出します。

PS C:\Users\takk\aaa> gci | ?{$_ -like "*10*"}


    ディレクトリ: C:\Users\takk\aaa


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2017/07/30     23:27         16 file10.txt


PS C:\Users\takk\aaa>

正規表現を使っての抽出には、-matchを使います。

PS C:\Users\takk\aaa> gci | ?{$_ -match "[135]"}


    ディレクトリ: C:\Users\takk\aaa


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2017/07/30     23:27         16 file1.txt
-a---        2017/07/30     23:27         16 file10.txt
-a---        2017/07/30     23:27         16 file3.txt
-a---        2017/07/30     23:27         16 file5.txt


PS C:\Users\takk\aaa>

Compare-Object (diff) ファイル比較

Compare-Objectは、その名の通りオブジェクトを比較するコマンドです。
配列$aと$bを比較してみましょう。

<=または=>
差分がある行が、左(<=)のオブジェクトのものか、右(=>)のオブジェクトのものかを表します。
引数の一番目に指定したオブジェクトは左(<=)、二番目に指定したオブジェクトは右(=>)です。

つまり、
5 <=
は、$aが$bに比べて、5という要素が余分にあることを表しています。

もう少し差分を増やしてコマンドを使ってみましょう。

$aは、2と4が多い。
ですね。

ファイルの差分を確認してみましょう。

ファイルの内容の比較ではないため、コマンドの結果も不一致が返ってきました。

ファイルの内容を比較するには、Get-Contentで各行を取得してから比較します。

関連記事はコチラ
PowerShell(Compare-Object)

Invoke-Item (ii) ファイルの実行

Invoke-Item [-Path] <string[]> [<CommonParameters>]
Invoke-Item [<CommonParameters>]

引数にファイルを指定すると、ファイルの拡張子に関連付けられたプログラムを起動します。
エイリアスは、iiです。

引数にフォルダを指定すると、Explorerでフォルダを開くことができます。

PS C:\Users\taku\Desktop> mkdir a
PS C:\Users\taku\Desktop>

PS C:\Users\taku\Desktop> ii a
PS C:\Users\taku\Desktop>

以下のようにフォルダが開きます。explorerコマンドよりも短くて使いやすいので結構使えます。

6.PowerShell .NET

PowerShellから.NET FrameWorkを使ってみます。

スタティックメソッドの呼び出し方法は、
[クラス]::メソッド()
です。

PS C:\Users\takk> [System.Console]::WriteLine("HELLO")
HELLO
PS C:\Users\takk>

PowerShellのWrite-OutPutだと改行されてしまうので、改行したくない場合は、.NETを使えば良いですね。

PS C:\Users\takk> [System.Console]::Write("HELLO1\nHELLO2")
HELLO1\nHELLO2PS C:\Users\takk>

変数に格納して実行することもできます。

PS C:\Users\takk> $con=[System.Console]
PS C:\Users\takk> $con::WriteLine("HELLO")
HELLO
PS C:\Users\takk>
PS C:\Users\takk> $math=[Math]
PS C:\Users\takk> $math::Sqrt(121)
11
PS C:\Users\takk>

インスタンスメソッドの呼び出しは、::の代わりに.(ドット)を使います。
RandomのNextメソッド。

PS C:\Users\takk> $r=New-Object System.Random
PS C:\Users\takk> $r.Next(10)
1
PS C:\Users\takk> $r.Next(10)
4
PS C:\Users\takk> $r.Next(10)
1
PS C:\Users\takk>

ArrayListのAddメソッド。

PS C:\Users\takk> $list=New-Object System.Collections.ArrayList
PS C:\Users\takk> $list.Add(10)
0
PS C:\Users\takk> $list.Add(20)
1
PS C:\Users\takk> $list.Add(30)
2
PS C:\Users\takk> $list
10
20
30
PS C:\Users\takk>

別アセンブリで、デフォルトで使えないクラスは、ロードします。

PS C:\Users\takk> [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

GAC    Version        Location
---    -------        --------
True   v4.0.30319     C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089...


PS C:\Users\takk> $f=New-Object System.Windows.Forms.Form
PS C:\Users\takk> $f.ShowDialog()

Add-Typeの場合。

PS C:\Users\takk> $f=new-object System.Windows.Forms.Form
new-object : 型 [System.Windows.Forms.Form] が見つかりません。この型を含むアセンブリが読み込まれていることを確認してく
ださい。
発生場所 行:1 文字:4
+ $f=new-object System.Windows.Forms.Form
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

PS C:\Users\takk> Add-Type -AssemblyName System.Windows.Forms
PS C:\Users\takk> $f=new-object System.Windows.Forms.Form
PS C:\Users\takk>

Convert 基数変換 16進数 10進数

PS C:\Users\takk> [Convert]::ToInt64("0x64", 16)
100
PS C:\Users\takk>

ArrayListとHashSet

.NETのArrayListとHashSetを使います。

配列の使い方はこうでした。

PS C:\Users\takk> $arr=1..10
PS C:\Users\takk> $arr
1
2
3
4
5
6
7
8
9
10
PS C:\Users\takk>

ArrayListへ置き換えるには、new-objectを使います。

PS C:\Users\takk> $lis = new-object System.Collections.ArrayList(,$arr)
PS C:\Users\takk> $lis
1
2
3
4
5
6
7
8
9
10
PS C:\Users\takk>

要素5番目に100を追加しましょう。

PS C:\Users\takk> $lis.Insert(5,100)
PS C:\Users\takk> $lis
1
2
3
4
5
100
6
7
8
9
10

HashSetの置き換えも同様です。object型です。

PS C:\Users\takk> $hashset=new-object System.Collections.Generic.HashSet[object](,$arr)
PS C:\Users\takk> $hashset
1
2
3
4
5
6
7
8
9
10
PS C:\Users\takk>

HashSetに重複した値を追加しようとすると、失敗します。

PS C:\Users\takk> $hashset.add(5)
False
PS C:\Users\takk> $hashset
1
2
3
4
5
6
7
8
9
10
PS C:\Users\takk>

差分を抽出してみましょう。
元の集合から、1,3,5,7,9を引いてみます。

PS C:\Users\takk> $hashset.ExceptWith(@(1,3,5,7,9))
PS C:\Users\takk> $hashset
2
4
6
8
10
PS C:\Users\takk>

7.PowerShell逆引き

パス区切り文字の変換

PS C:\Users\takk\aaa> ls -n -r
dir1
dir1\dir2
dir1\dir2\dir3
PS C:\Users\takk\aaa>

\を/に置換します。

PS C:\Users\takk\aaa> ls -n -r | %{$_.Replace("\","/")}
dir1
dir1/dir2
dir1/dir2/dir3
PS C:\Users\takk\aaa>

バイナリファイル読み込み

バイナリファイルは-Encodingをbyteで指定して、Get-Contentで読み込めます。

PS C:\Users\takk\aaa> cat -encoding byte a.bin
255
254
49
0
50
0
51
0
13
0
10
0
PS C:\Users\takk\aaa>

バイナリファイル書き込み

PS C:\Users\takk\aaa> [byte[]]$bin=0..255
PS C:\Users\takk\aaa> sc -value $bin -encoding byte a.bin
PS C:\Users\takk\aaa>

複数ファイルの置換

ForEach-Objectを使って、複数のファイルを置換してみます。

二行目の末尾に印をつけます。

PS C:\Users\takk> ls -s -n -File | %{$fname=$_+".newfile";cat $_ | %{ $_ -creplace "^(2.*)$","$& <---" >> $fname}}
PS C:\Users\takk>

各ファイルの内容を確認。2行目に印がつきました。

PS C:\Users\takk> ls -s -n -Filter *.newfile | %{echo ===$_===;cat $_}
===1009\7783\03\file_1009778303.txt.newfile===
1   1009778303
2   1009778303 <---
3   1009778303
4   1009778303
===1140\3858\4\file_114038584.txt.newfile===
1   114038584
2   114038584 <---
3   114038584
4   114038584
===1236\9624\05\file_1236962405.txt.newfile===
1   1236962405
2   1236962405 <--- 3 1236962405 4 1236962405 PS C:\Users\takk>

指定ファイルの一覧取得

linuxでやるとfind -name file_4.*、というような一覧を取得するには、
-includeオプションを指定して、,(カンマ)で区切ればよいです。
-includeは-iで省略できます。

PS C:\Users\takk\aaa> ls -name -re -i file_1.txt,file_2.txt,file_4.*
12\74\06\63\23\file_1.txt
14\53\23\53\43\file_2.txt
86\03\02\65\2\file_4.txt
PS C:\Users\takk\aaa>

フルパスの取得は、dirを使います。

PS C:\Users\takk\aaa> cmd /c "dir /b /s file_1.txt file_2.txt file_4.*"
C:\Users\takk\aaa\12\74\06\63\23\file_1.txt
C:\Users\takk\aaa\14\53\23\53\43\file_2.txt
C:\Users\takk\aaa\86\03\02\65\2\file_4.txt
PS C:\Users\takk\aaa>

cut代替

Unix/Linuxのcutコマンドは、

takk~/tmp$ cat file.txt
A1	B1	C1	D1
A2	B2	C2	D2
A3	B3	C3	D3
A4	B4	C4	D4
A5	B5	C5	D5
takk~/tmp$ 

上記のようにタブ区切りテキストの、任意のフィールドを抽出することができるコマンドです。

takk~/tmp$ cut -f2,4 file.txt
B1	D1
B2	D2
B3	D3
B4	D4
B5	D5
takk~/tmp$ 

PowerShellでUnix/Linuxのcutコマンドのようにフィールドを抽出する処理を書いてみましょう。

file.txtは、タブ区切りのテキストファイルです。

-Splitを使って区切り文字で文字列を分割し、配列に格納することができます。

各変数に各フィールドの文字列を格納し、好きなように組み立てればcut同等の処理になります。

cutよりも優れていることは、同じフィールドを複数回表示できる点と、列の順序の入れ替えができる点です。

関連記事はコチラ
PowerShell(cutコマンド代替)

join代替

Unix/Linuxのjoinコマンドは指定列の同一項目を結合するコマンドです。

takk~/tmp$ cat file1
1	A1
2	A2
3	A3
4	A4
5	A5
takk~/tmp$ cat file2
3	B3
5	B5
takk~/tmp$ join -a 1 file1 file2
1 A1
2 A2
3 A3 B3
4 A4
5 A5 B5
takk~/tmp$ 

PowerShellでもjoinのような処理を作ってみましょう。

以下の2つのファイル(file1 file2)を使います。

PS C:\Users\takk> cat file1
1       A1
2       A2
3       A3
4       A4
5       A5
PS C:\Users\takk> cat file2
3       B3
5       B5
PS C:\Users\takk>

1列目の情報でjoinしてみます。連想配列を使います。

joinできました。

このままだと使いにくいので、関数にします。

PS C:\Users\takk> function join($f1, $f2){
>> cat $f2 | %{$hash=@{}}{$a,$b=$_.split("`t");$hash.add($a,$b)}{
>> cat $f1 | %{$a,$b=$_.split("`t");"$_`t"+$hash["$a"]}}
>> }
PS C:\Users\takk>                                                                                          

関数名はjoinにしました。

join ファイル名 ファイル名

上記コマンドを実行すると、各ファイルの1列目の文字列が一致する行を結合します。

joinコマンドの引数に指定するファイルを逆に指定すれば、結合順序を逆にできます。

head代替

Unix/Linuxのheadコマンドは、ファイルの冒頭を抽出するコマンドです。

takk~/tmp$ cat file1.txt
1	A1
2	A2
3	A3
4	A4
5	A5
6	A6
7	A7
8	A8
9	A9
10	A10
takk~/tmp$ head -5 file1.txt
1	A1
2	A2
3	A3
4	A4
5	A5
takk~/tmp$ 

PowerShellでもheadっぽいことをやってみます。

現在カレントフォルダ内には以下のファイルがあります。

file1.txtの内容を確認してみます。

これを頭から5行だけ表示するには、スライスを使えばよいです。

全ファイル頭5行を表示してみましょう。

これでは各ファイルの境界が分かりません。
Linuxのheadコマンドと同じように、ヘッダ(“==> ファイル名 <==")をつけて見ます。

関連記事はコチラ
PowerShell(head代替)

tail代替

Unix/Linuxのtailコマンドは、headコマンドの逆で、ファイル末尾を指定数行分抽出するコマンドです。

takk~/tmp$ cat file1.txt
1	A1
2	A2
3	A3
4	A4
5	A5
6	A6
7	A7
8	A8
9	A9
10	A10
takk~/tmp$ tail -3 file1.txt
8	A8
9	A9
10	A10
takk~/tmp$ 

PowerShellでtailコマンドのようにテキストファイルの末尾抽出してみます。

headではスライスを使って抽出しました。tailでもスライスを使えます。

Get-Contentには、-Tailオプションがあるので、これを使うともっと簡単に書けます。

最初にやった全ファイルの処理を、-Tailオプションを使って実行してみましょう。

関連記事はコチラ
PowerShell(tail代替)

wc代替

Unix/Linuxのwcコマンドは、ファイルの行数や単語数がカウントできるコマンドです。

takk~/tmp$ cat file1.txt
1	A1
2	A2
3	A3
4	A4
5	A5
6	A6
7	A7
8	A8
9	A9
10	A10
takk~/tmp$ wc file1.txt
10 20 52 file1.txt
takk~/tmp$ wc -l file1.txt
10 file1.txt
takk~/tmp$ 

PowerShellでwc -l(行数カウント)と同様の処理をしてみましょう。Get-Contentを使います。

Get-Contentは、ファイルの内容を表示するコマンドです。

gc file1.txt

このGet-Contentで得たテキストを、Countプロパティで行数が確認できます。

(gc file1.txt).Count

カレントフォルダ中の全ファイルの行数を表示してみます。

ls -n | %{$_ +" "+ (gc $_).Count}


wcコマンドとは表示方法が逆ですが、こちらの方がわかりやすいです。

関連記事はコチラ
PowerShell(wc代替)

paste代替

Unix/Linuxのpasteコマンドは二つのファイルの各行を連結します。

takk~/tmp$ cat file1.txt
1	A1
2	A2
3	A3
4	A4
5	A5
6	A6
7	A7
8	A8
9	A9
10	A10
takk~/tmp$ cat file2.txt
1	B1
2	B2
3	B3
4	B4
5	B5
6	B6
7	B7
8	B8
9	B9
10	B10
takk~/tmp$ paste file1.txt file2.txt
1	A1	1	B1
2	A2	2	B2
3	A3	3	B3
4	A4	4	B4
5	A5	5	B5
6	A6	6	B6
7	A7	7	B7
8	A8	8	B8
9	A9	9	B9
10	A10	10	B10
takk~/tmp$ 

pasteコマンドと同じようなことを、PowerShellでやってみます。

元ファイルはこれです。

まずは各ファイルを変数に格納。

片方の変数の行数を確認して、forで一行ずつ表示します。

for内の変数表示の処理に、もう片方の変数表示も加えれば、簡易pasteの完成です。

関連記事はコチラ
PowerShell(paste代替)

8.その他関連記事

PowerShellで旗
PowerShellでeval
PowerShellでファイルダンプコマンドを作る
PowerShellでさくっと数列、集計
PowerShellでstatもどきを作る
ファイルパスと行番号から該当行抽出(PowerShell)

9.付録 エイリアス一覧

バージョン5.1でのget-aliasで表示された一覧です。

% -> ForEach-Object
? -> Where-Object
ac -> Add-Content
asnp -> Add-PSSnapin
cat -> Get-Content
cd -> Set-Location
CFS -> ConvertFrom-String
chdir -> Set-Location
clc -> Clear-Content
clear -> Clear-Host
clhy -> Clear-History
cli -> Clear-Item
clp -> Clear-ItemProperty
cls -> Clear-Host
clv -> Clear-Variable
cnsn -> Connect-PSSession
compare -> Compare-Object
copy -> Copy-Item
cp -> Copy-Item
cpi -> Copy-Item
cpp -> Copy-ItemProperty
curl -> Invoke-WebRequest
cvpa -> Convert-Path
dbp -> Disable-PSBreakpoint
del -> Remove-Item
diff -> Compare-Object
dir -> Get-ChildItem
dnsn -> Disconnect-PSSession
ebp -> Enable-PSBreakpoint
echo -> Write-Output
epal -> Export-Alias
epcsv -> Export-Csv
epsn -> Export-PSSession
erase -> Remove-Item
etsn -> Enter-PSSession
exsn -> Exit-PSSession
fc -> Format-Custom
fhx -> Format-Hex
fl -> Format-List
foreach -> ForEach-Object
ft -> Format-Table
fw -> Format-Wide
gal -> Get-Alias
gbp -> Get-PSBreakpoint
gc -> Get-Content
gci -> Get-ChildItem
gcm -> Get-Command
gcs -> Get-PSCallStack
gdr -> Get-PSDrive
ghy -> Get-History
gi -> Get-Item
gjb -> Get-Job
gl -> Get-Location
gm -> Get-Member
gmo -> Get-Module
gp -> Get-ItemProperty
gps -> Get-Process
gpv -> Get-ItemPropertyValue
group -> Group-Object
gsn -> Get-PSSession
gsnp -> Get-PSSnapin
gsv -> Get-Service
gu -> Get-Unique
gv -> Get-Variable
gwmi -> Get-WmiObject
h -> Get-History
history -> Get-History
icm -> Invoke-Command
iex -> Invoke-Expression
ihy -> Invoke-History
ii -> Invoke-Item
ipal -> Import-Alias
ipcsv -> Import-Csv
ipmo -> Import-Module
ipsn -> Import-PSSession
irm -> Invoke-RestMethod
ise -> powershell_ise.exe
iwmi -> Invoke-WMIMethod
iwr -> Invoke-WebRequest
kill -> Stop-Process
lp -> Out-Printer
ls -> Get-ChildItem
man -> help
md -> mkdir
measure -> Measure-Object
mi -> Move-Item
mount -> New-PSDrive
move -> Move-Item
mp -> Move-ItemProperty
mv -> Move-Item
nal -> New-Alias
ndr -> New-PSDrive
ni -> New-Item
nmo -> New-Module
npssc -> New-PSSessionConfigurationFile
nsn -> New-PSSession
nv -> New-Variable
ogv -> Out-GridView
oh -> Out-Host
popd -> Pop-Location
ps -> Get-Process
pushd -> Push-Location
pwd -> Get-Location
r -> Invoke-History
rbp -> Remove-PSBreakpoint
rcjb -> Receive-Job
rcsn -> Receive-PSSession
rd -> Remove-Item
rdr -> Remove-PSDrive
ren -> Rename-Item
ri -> Remove-Item
rjb -> Remove-Job
rm -> Remove-Item
rmdir -> Remove-Item
rmo -> Remove-Module
rni -> Rename-Item
rnp -> Rename-ItemProperty
rp -> Remove-ItemProperty
rsn -> Remove-PSSession
rsnp -> Remove-PSSnapin
rujb -> Resume-Job
rv -> Remove-Variable
rvpa -> Resolve-Path
rwmi -> Remove-WMIObject
sajb -> Start-Job
sal -> Set-Alias
saps -> Start-Process
sasv -> Start-Service
sbp -> Set-PSBreakpoint
sc -> Set-Content
select -> Select-Object
set -> Set-Variable
shcm -> Show-Command
si -> Set-Item
sl -> Set-Location
sleep -> Start-Sleep
sls -> Select-String
sort -> Sort-Object
sp -> Set-ItemProperty
spjb -> Stop-Job
spps -> Stop-Process
spsv -> Stop-Service
start -> Start-Process
sujb -> Suspend-Job
sv -> Set-Variable
swmi -> Set-WMIInstance
tee -> Tee-Object
trcm -> Trace-Command
type -> Get-Content
wget -> Invoke-WebRequest
where -> Where-Object
wjb -> Wait-Job
write -> Write-Output

コメント

タイトルとURLをコピーしました