LinuxやUnixのコマンドが使える人って、PowerShellってとっつきにくくないですか?
コマンドレットっていう聞き慣れない用語とか、何だかよく分からないオブジェクトを処理する、とか。
特にテキスト整形だけやりたい人は、回りくどい説明を理解しなきゃいけないのが苦痛だったりします。
LinuxやUnixと同じようなことは、できるのか? できるとすれば、どうすればできるのかを、すぐ知りたい。
そんな思いをする人に向けて、簡単に理解できる使い方サンプルをまとめています。
初心者の人にも読めるようにまだまだ見直し中ですが、本記事が、何かの足しになったら幸いです。
対象バージョンは以下です。
Contents
- 1.PowerShell を始めるには
- 2.PowerShell エイリアス
- 3.PowerShell 変数、関数
- 4.PowerShell 制御
- 5.PowerShell 各コマンドレット
- Get-ChildItem (ls gci dir) 一覧表示
- Get-Item (gi) ファイル表示
- New-Item (mkdir) ディレクトリ作成
- Set-Location (cd) ディレクトリ変更
- Get-Content (gc cat) テキスト内容表示
- Set-Content (sc) 内容書き込み
- Move-Item (mv) ファイル名変更
- Remove-Item (rm) ファイル削除
- Join-Path パスの結合
- Convert-Path 絶対パスへ変換
- Get-Random 乱数
- Compress-Archive ZIP圧縮
- Expand-Archive ZIP解凍
- Select-String (sls) 文字列検索
- Get-FileHash ハッシュ値取得
- Get-Date 日付時刻の取得、計算
- Test-Path パス存在チェック
- Where-Object
- Compare-Object (diff) ファイル比較
- Invoke-Item (ii) ファイルの実行
- 6.PowerShell .NET
- 7.PowerShell逆引き
- 8.その他関連記事
- 9.付録 エイリアス一覧
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
コメント