rcmdnk's blog
Last update

Windows PowerShellクックブック

Windows 10ではPackageManagementというツールによって アプリの管理等がPowerShellからコマンドベースで出来る様になってるので、 Macで Homebrew+ Brew-file 的な感じでやってる設定管理の様なものが出来ないかということで、 取り敢えずPowerShellで出来ないかな、と思いちょっとPowerShellを勉強中。

PowerShellを使ってみて

PowerShellの基本的な事とかはネット上に溢れているので、 取り敢えず気になったこととか、他の言語と似てるとかぜんぜん違うとか、 間違いそうになったところとかのまとめ。

以下Windows10でPowerShell 3.0を使っています。

ExecutionPlicyの設定


PowerShell

PowerShell
PS > Set-ExecutionPolicy RemoteSigned



PowerShell


Microsoft


Strongly Encouraged Development Guidelines: https://msdn.microsoft.com/en-us/library/dd878270#SD03


Cmdlet(StyleGuide)

Get-Packages-

bashrc


Bash.bashrc $PROFILE
C:\Users\<USER>\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1


追記: 2016/03/17

ちょっと作ってみたもの。

追記ここまで

変数


$x$

$使 PowerShell
$x = 1
Write-Host $x

=

()

()



$array = @("a", "b", "c")

@()[]

PowerShell,
$array = "a", "b", "c"



$array[0] $array.Length


$array += "d"

+=


$hash = @{"a" = 1; "b" = 2; "c" = 3}

@{} ;=

$hash["a"]


$hash.Add("d", 4)

Add使

$hash.Keys$hash.Values

配列を""内で使う時は注意


: 2016/03/27 

" $PowerShell
 
> $array = @("a", "b", "c")
> Wriet-Host $array
a b c
> Wriet-Host "$array"
a b c
> Wriet-Host $array[0]
a
> Wriet-Host "$array[0]"
a b c[0]
> Wriet-Output $array
a
b
c
> Wriet-Output "$array"
a b c
> Wriet-Output $array[0]
a
> Wriet-Output "$array[0]"
a b c[0]
> if($array -eq "a"){ echo OK }
OK
> if($array[0] -eq "a"){ echo OK }
OK
> if("$array" -eq "a"){ echo OK }
> if("$array[0]" -eq "a"){ echo OK }
> if("$array" -eq "a b c"){ echo OK }
OK
> if("$array[0]" -eq "a b c"){ echo OK }
>

""[]

Write-HostWrite-Output Write-Host""

if"" []

${array[0]} "$($array[0])"$()""


大文字小文字の区別




PowerShell-h-help man
> Get-Help Get-Packages

Get-Help使helphelp Get-PackagesOK

-detaied-examples-full 使


#.SYNOPSIS
# Synopsis of the script

.<KEY>


IT調: PowerShell

Write-Output (echo)


echoWrite-Output

使 Write-Output 使

使 return使 Write-Output

return returnWrite-Output



echo 使

Write-Host使

Write-Host
> My-Cmd > log

log

echo使Write-Output使

Write-Output

使




function MyFunction ($par0="aaa", $par1) {
  ...
}

C++ +  function

()


function MyFunction {
  Param($par0="aaa", $par1)
  ...
}

Praram


function MyFunction {
  Write-Host $args[0]
  ...
}

args

Paramargs 使


MyFunction -par0 "bbb" -par1 "ccc"

$-


MyFunction "bbb" "ccc"



-

HOME


$HOME vim使 $Env:HOME

$Env:XXXWindows $Env:HOMEPATH$HOME

/blog/2013/11/11/computer-windows-cygwin/#section/

CygwinHOMEWindows $Env:HOME

PowerShell$HOME(C:\Users\user)

foreachForEach-Object


For使 alias foreachForEach-Object

使
foreach($x in $array){
  Write-Host $x
}


ForEach-Object -InputObject $array {
  Write-Host $_
}

ForEach-Object使 foreach

foreach ForEach-Object

foreach

foreach使


PowerShellForeach-Object - tech.guitarrapc.cóm


ForEach-Object% ForEach-Object


1`
MyCommand `
  -option1 "aaa" `
  -option2 "bbb"

()

if ($a -eq aaa) return 1


Cif使
if ($a -eq "aaa") return 1

使
if ($a -eq "aaa") {return 1}

{}

Split


Split()
> $x = "aaa bbb  ccc"
> $x.Split()

["aaa", "bbb", "", "ccc"]


 > -split $str


コマンド結果をファイルへ出力

追記: 2016/03/27

> Get-Help Write-Output > help.txt

みたいな事をするとヘルプのオブジェクトが書き出されるため、 バイナリな内容になって開いてもヘルプの内容がそのままでは見れません。

表示される内容を通常のテキストの様に出力するには

> Get-Help Write-Output | Out-File help.txt -encoding utf8

と、オブジェクトをパイプでOut-Fileに渡し、 さらにencodingしてあげるとテキストとして書き出すことが出来ます。

追記ここまで

シェルスクリプトでよく使うコマンドの類似コマンド

PowerShellのコマンドは基本的にWrite-Outputみたいな チェインケース+パスカルケースの形をしていますが、 echoの様にシェルスクリプトでよく使う名前にエイリアスされているものが結構有ります。

Alias Original Command Note
cat Get-Content  
cd Set-Location cdとだけ打っても移動しない。($HOMEに行ったりしない。)cd -みたいな前に戻る、は出来ない。
clear Clear-Host  
cp Copy-Item  
curl/wget Invoke-WebRequest Invoke-WebRequest -Uri <Uri> -OutFile <string>でUriの物をダウンロード。
diff Compare-Object  
echo Write-Output 単純なテクスト出力ではなくオブジェクト出力。関数内等で使うと返り値の一部として扱われる。また、コマンドを書かず単に変数名や関数名を書いただけでもその内容が返される。
history (h) Get-History  
kill Stop-Process  
ls Get-ChildItem  
man Get-Help  
mkdir New-Item -type directory New-Item -type fileなら新規ファイル作成。
mv Move-Item Rename-Itemというコマンドもあるが、こちらは変更後はパス名を除いたオブジェクト名だけを書く。同じフォルダの中で名前を変える専用。また、名前を変えるだけなので他の同じ名前のファイル等があれば上書きは出来ない。
popd Pop-Location  
ps Get-Process  
rm Remove-Item -rとかなしにディレクトリも消せる。
sleep Start-Sleep  
sort Sort-Object  
tee Tee-Object  

勿論オプションの種類も違いますし Noteに書いてある事以外にも沢山違いが有って、 逆に同じ名前で使える事で違いに戸惑う事もありますが、 取り敢えずこんな感じである程度のコマンドが同じようにあります。

それ以外のエイリアスではないけど同じ様なコマンドとしては、

Linux Command PowerShell Command Note
alias Get-Alias/alias 引数無しで使い全てのエイリアスを表示するコマンドとして。エイリアスをセットするにはSet-Alias とする。
grep Select-String -Path <string> -Pattern <string>の形で検索ファイルとパターンを渡すがオプション無しで渡す場合にはLinuxと逆の順番。
fg Receive-Job  
find Get-ChildItem -Recurse find -name XXXGet-ChildItem -Recurse|Where-Object {$_.Name -Match "XXX"}
jobs Get-Job  
read Read-Host  
sed ‘s/xxx/yyy/g’ a.txt Get-Content .\a.txt | % {$_ -Replace "xxx", "yyy"} さらにファイルの中身を置換してしまうならパイプを続けて|Set-Content .\a.txtを追加すれば良い。
tail Get-Content -Tail 必ず行数指定が必要。tail -fのようにアップデートを待って表示するにはGet-Content -Tail 5 -Waitの様に-Waitを付ける。
スクリプト等の中でファイルを開いて何かを書き出してる間は-Waitが上手く動かない、という話も(ファイルのタイムスタンプが変わらない様な扱いで出力ファイルに記述することが出来るため)1
uniq Get-Unique Get-Uniqueでは連続してない行も検索し全ての重複を削除する。PowerShellではguにエイリアスされている。
wc -l $(Get-Content .\file.txt).Length  
& Start-Job {} バックグラウンドジョブの始め方。

この辺りがLinuxコマンド的な物に近い動作をしてくれます。 自分でSet-Alias uniq Get-Uniqueみたいにしておいても良いかも。

「 Linux ならできるのに、だから Windows は…」「それ PowerShell でできるよ」 - Qiita

PowerShell の基本: http://bonk.red/articles/PowerShell/basic.html

Sponsored Links

Sponsored Links

« Liquidタグ(Jekyll, Octopress)でYAMLのハッシュを取り扱う方法 apt-cygのオリジナルレポジトリ復活 »

}