#author("2022-03-05T12:29:21+09:00","default:ham","ham")
#author("2022-03-05T17:20:31+09:00","default:ham","ham")
#amazon(4873113822)
#amazon(477415542X)
#contents
#br
#adsense(728x90)
#br

* 概要 [#z50e8cb9]

- cmd.exe に代わる Windows 用のシェル、スクリプト言語
- Windows Script Host の後継
- Windows 7、Windows Server 2008 R2 は PowerShell 2.0 が標準でインストールされている
- それ以前の OS は別途インストールする
** プログラム [#cb563c4d]

- Windows PowerShell
-- シェル
- Windows PowerShell ISE [Integrated Scripting Environmentnt]
-- PowerShell の開発環境

** スクリプト [#vfea96b5]

- 拡張子は .ps1
- Windows Server 2012 まではデフォルトでスクリプトの実行が禁止されているため、[[Set-ExecutionPolicy>#n46d8550]] で変更する必要がある
** 関連付け [#q40c5246]

- デフォルトでは .ps1 ファイルをダブル クリックするとメモ帳が起動する
- レジストリの HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell の値が Open になっている
- Open は notepad.exe に関連付けられているため、powershell.exe に関連付けられている 0 に変更するとダブル クリックでスクリプトが実行される
* 制御 [#d44f5e96]


** 条件分岐 [#v522a1e2]

*** if [#h7906c63]

#pre(soft){{
if ( '''expr1''' )
{
        command1
}
else
{
        command3
}
}}


** 繰り返し [#dd4b25f8]

*** for [#l2043ef1]

- 変数にリストを順次組み込み、処理を繰り返す。
#pre(soft){{
for ( '''init'''; '''expr'''; '''roop''' )
{
        '''command'''
}
}}

- ex) 変数 i が 10 未満の場合に、処理を行う (この場合、10 回処理を繰り返す)
#pre(soft){{

for ( $i=0; $i -le 10; $i++ )
{
        Write-Host "$i"
}
}}


*** while [#k85bc688]

- 条件式が真である間、処理を繰り返す
#pre(soft){{
while ( '''expr''' )
{
        '''command'''
}
}}

- ex) 変数 i が 10 未満の場合に、処理を行う (この場合、10 回処理を繰り返す)
#pre(soft){{
$i=0
while ( $i -le 10 )
{
        Write-Host "$i"
        $i++
}
}}

*** do/while [#o6732149]

- while と似ているが、条件式の判定を最後に行う
- 最初の 1 回は必ず実行される
#pre(soft){{
do
{
        '''command'''
}
while ( '''expr''')
}}


*** foreah [#o174fe72]

- 配列を逐次処理する
#pre(soft){{
foreach ($i in $'''var''')
{
        '''command'''
}
}}

*** switch [#y2b47fc5]
** 中断 [#e08460b8]

*** break [#se234077]
- ループ処理を中断して次の処理に進む

*** continue [#e4617bc8]
- ループ処理の後続を飛ばして、ループの先頭に戻る


* 条件式 (expression) [#i3be28c3]
** ファイルの条件式 [#w501f5ef]

|条件式|意味|説明|h
|-d '''file'''|directory|'''file''' がディレクトリなら真|
|-f '''file'''|file|'''file''' がファイルなら真|
|-e '''file'''||'''file''' が存在すれば真|
|-r '''file'''|read|'''file''' が存在して、読み込み可能なら真|
|-w '''file'''|write|'''file''' が存在して、書き込み可能なら真|
|-x '''file'''|excute|'''file''' が存在して、実行可能なら真|
|-s '''file'''|size|'''file''' が存在して、サイズが 0 でなければ真|
** 文字の条件式 [#r7978062]
|条件式|説明|h
|'''str1''' = '''str2'''|'''str1''' と '''str2''' が等しければ真|
|'''str1''' != '''str2'''|'''str1''' と '''str2''' が等しくなければ真|
|-z '''str'''|'''str''' が空なら真|
|-n '''str'''&br;'''str'''|'''str''' が空でなければ真|
** 整数の条件式 [#h018e46f]
|条件式|意味|説明|h
|'''num1''' -eq '''num2'''|equal|'''num1''' と '''num2''' が等しければ真|
|'''num1''' -ne '''num2'''|not equal|'''num1''' と '''num2''' が等しくなければ真|
|'''num1''' -gt '''num2'''|greater than|'''num1''' が '''num2''' 超なら真|
|'''num1''' -lt '''num2'''|less than|'''num1''' が '''num2''' 未満なら真|
|'''num1''' -ge '''num2'''|less than or equal|'''num1''' が '''num2''' 以上なら真|
|'''num1''' -le '''num2'''|greater than or equal|'''num1''' が '''num2''' 以下なら真|

** 型の判定 [#v8f2da83]
|条件式|説明|h
|$'''var''' -is '''type'''|型が正しければ真|
|$'''var''' -isnot '''type'''|型が正しくなければ偽|


** その他 [#d7e9c6d7]

|条件式|説明|h
|Test-Path '''path''' [-PathType Leaf|Container]|'''path''' が存在する場合は真&br;Leaf … ファイル指定&br;Container … ディレクトリ指定|
|Test-Connection '''host'''|'''host''' の PING 応答がある場合は真|
** 論理結合 [#g71780eb]

- 条件式の条件式
|条件式|意味|説明|h
|! '''expr'''|-not|'''expr'''が偽なら真|
|'''expr1''' -and '''expr2'''|and|'''expr1''' と '''expr2''' が両方真なら真|
|'''expr1''' -or '''expr2'''|or|'''expr1''' か '''expr2''' のどちらかが真なら真|

* 変数 (variable) [#b24c6da8]

** 特殊変数 [#kf677142]

|変数|説明|h
|$args['''num''']|'''num''' 番目の引数|
|$?|直前のコマンドの終了コード|
|$null|Null|
|$true|真|
|$false|偽|
|$_&br;$input|パイプで渡されたオブジェクト|
* コマンドレット [#a0440885]
*** Get-Command [#u3f48208]
- コマンドレットの一覧を出力する
#pre(soft){{
Get-Command
}}

- ex)
#pre(soft){{
PS C:\Users\user> Get-Command↵

CommandType     Name                            Definition
-----------     ----                            ----------
Alias           %                               ForEach-Object
Alias           ?                               Where-Object
Function        A:                              Set-Location A:
Alias           ac                              Add-Content
Cmdlet          Add-Computer                    Add-Computer [-DomainName] <...
Cmdlet          Add-Content                     Add-Content [-Path] <String[...
Cmdlet          Add-History                     Add-History [[-InputObject] ...
Cmdlet          Add-Member                      Add-Member [-MemberType] <PS...
Cmdlet          Add-PSSnapin                    Add-PSSnapin [-Name] <String...
Cmdlet          Add-Type                        Add-Type [-TypeDefinition] <...
Alias           asnp                            Add-PSSnapIn
}}

*** Get-Alias [#t6cfdaad]

- エイリアスの一覧を出力する
*** Set-ExecutionPolicy [#n46d8550]

- スクリプトの実行ポリシーを変更する
#pre(soft){{
Set-ExecutionPolicy '''policy'''
}}

|ポリシー|説明|h
|Restricted|すべてのスクリプトの実行を禁止 (Windows Server 2012 までのデフォルト)|
|AllSigned|すべてのスクリプトに証明書を要求|
|RemoteSigned|インターネットでダウンロードしたスクリプトのみ証明書を要求 (Windows Server 2012 R2 以降のデフォルト)|
|Unrestricted|すべてのスクリプト実行を許可&br;インターネットでダウンロードしたスクリプトは確認画面が出る|
|Bypass|すべてのスクリプト実行を許可|
*** Get-History (history) [#mc9d3e41]
- コマンド実行履歴を出力する
*** Get-Help [#ped4cdbd]
- コマンドレットのヘルプを出力する
#pre(soft){{
 Get-Help '''Cmdlet'''
}}
** プロセス [#j681f568]
*** Get-Process (ps) [#qc614144]
- プロセスの一覧を出力する
#pre(soft){{
Get-Process ['''option''']
}}
-- .exe は付かない


|オプション|説明|h
|-Id|プロセス ID|
|-Name|プロセス名 ワイルドカード、カンマ区切りで複数指定可能|
*** Start-Process [#h5b26460]
- プロセスを起動する
#pre(soft){{
PS C:\User\user> Stop-Process ['''option''']
}}
|オプション|説明|h
|-FilePath|起動プログラムのパス|

*** Stop-Process (kill) [#j09c6201]
- プロセスを停止する
#pre(soft){{
PS C:\User\user> Stop-Process ['''option''']
}}

|オプション|説明|h
|-Id|PID|
|-Name|プロセス名 ワイルドカード、カンマ区切りで複数指定可能|
|-Confirm|確認を要求する|


** ファイル操作 [#k7859c74]

*** Get-Location (pwd) [#s86d79cb]

*** Set-Location (cd) [#a0215aef]

*** Get-ChildItem (ls) [#e216c57d]
- ファイルの一覧を出力する
#pre(soft){{
PS C:\User\user> Get-ChildItem ['''option''']
}}
|オプション|説明|h
|-Force|隠しファイルも出力 (ls -la)|
|-Recurse|再帰的に出力 (ls -r)|
|-Filter "'''filter'''"||

- ex)
#pre(soft){{
PS C:\Users\user> Get-ChildItem&crarr;


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


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d-r--        2013/02/07     16:38            Contacts
d-r--        2013/03/22     19:24            Desktop
d-r--        2013/03/11     18:35            Documents
d-r--        2013/03/22     17:34            Downloads
d-r--        2013/02/07     16:38            Favorites
d-r--        2013/02/26     11:26            Links
d-r--        2013/02/07     16:38            Music
d----        2013/03/01     11:07            Oracle
d-r--        2013/02/07     16:38            Pictures
d-r--        2013/02/07     16:38            Saved Games
d-r--        2013/02/07     16:38            Searches
d-r--        2013/02/07     16:38            Videos
}}
- ex)
#pre(soft){{
PS C:\Users\user> Get-ChildItem -Filter "*.txt"&crarr;
PS C:\> Get-ChildItem -Filter "*.txt"&crarr;
}}
- ex) C:\dir 配下のすべての Thumbs.db を削除する
#pre(soft){{
PS C:\> Get-ChildItem -Path C:\dir\ -Include Thumbs.db -Recurse -Force | Remove-Item -Force
}}
*** Move-Item (mv) [#c57be668]

*** Copy-Item (cp) [#v70f01dd]

*** Remove-Item (rm) [#j7abde15]

#pre(soft){{
PS C:\> Remove-Item '''file''' ['''option''']
}}

|オプション|説明|h
|-Recurse|確認なしに再帰的に削除する|
|-Force|非表示、読み取り専用属性ファイルを削除する|
|-Confirm|確認を表示する|
|-WhatIf|実際の削除は行わず、処理内容を出力する|

*** mkdir (Function) [#p8adedcc]
** オブジェクト操作 [#b2ed8260]
*** Write-Output (echo) [#za501d2c]

- 標準出力に出力する
#pre(soft){{
[Write-Output] '''object'''
}}

- ex) 文字列を出力する
#pre(soft){{
PS C:\> Write-Output "aaa"
aaa
PS C:\> Write-Output "aaa" "bbb"
aaa
bbb
PS C:\> Write-Output "aaa","bbb"
aaa
bbb
}}
- ex) Write-Output を省略することも出来る
#pre(soft){{
PS C:\> "aaa"
aaa
PS C:\> "aaa","bbb"
aaa
bbb
}}
- ex) 省略した場合、複数要素をスペースで区切ることは出来ない
#pre(soft){{
PS C:\> "aaa" "bbb"
Unexpected token 'bbb' in expression or statement.
At line:1 char:12
+ "aaa" "bbb" <<<<
    + CategoryInfo          : ParserError: (bbb:String) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken
}}


*** Get-Content (cat, tail, wc -l) [#fa735078]

- ファイル内容を出力する
#pre(soft){{
PS C:\> Get-Content '''file''' ['''option''']
}}

- '''num1''' 行目から '''num2''' までを出力
#pre(soft){{
PS C:\> (Get-Content '''file''')['''num1..num2''']
}}
-- '''num'''
--- 正数は先頭からの行数、負数は最終行からの行数
--- 0 が先頭行、-1 が最終行

- 行数を出力 (wc -l)
#pre(soft){{
PS C:\> (Get-Content '''file''').Length
}}



- 末尾 '''num''' 行を出力する (tail)
#pre(soft){{
PS C:\> Get-Content -Path '''file''' -Tail '''num'''
}}


- 末尾 10 行を出力し、追加された行を随時出力する (tail -f)
#pre(soft){{
PS C:\> Get-Content -Path '''file''' -Wait -Tail 10
}}
*** Select-String (=grep) [#zbd9a0cb]

#pre(soft){{
PS C:\> Select-String [-Pattern] '''pattern''' [-Path] '''filename'''
PS C:\> Get-Content '''path''' | Select-String [-Pattern] '''pattern'''
}}

|オプション|説明|h
|-NotMatch|'''pattern''' に不一致な行を出力|
|-CaseSensitive||
|-Quiet|出力内容がある場合は真、ない場合は偽を返す|

*** Sort-Object (sort) [#wc8b466f]

|オプション|意味|h
|-CaseSensitive|大文字小文字を区別する|
|-Descending|降順で並び替える|
|-Unique|重複を排除する (Get-Unique と同じ)|
|-property '''property'''|並べ替え対象のプロパティを指定する|
|-last '''num'''|最後の '''n''' 行を出力する|

*** Set-ItemProperty (touch) [#q2667393]

#pre(soft){{
PS C:\> Set-ItemProperty '''path''' -Name '''property''' -Value '''time'''&crarr;
}}
-- '''property'''
--- CreationTime 
--- LastWriteTime
-- '''time'''
--- $(Get-Date)


-ex) C:\dir\ 直下のファイル/フォルダの作成日時を設定する
#pre(soft){{
PS C:\> Set-ItemProperty C:\dir\ -Name CreationTime  -Value "2022/01/01 00:00:00"&crarr;
}}
-ex) C:\dir\ 配下すべてのファイル/フォルダの更新日時を設定する
#pre(soft){{
PS C:\> Get-ChildItem -Recurse C:\dir\ | ForEach-Object {Set-ItemProperty $_.FullName -Name LastWriteTime -Value "2022/03/07 00:00:00"}&crarr;
}}


** その他 [#n62140aa]

*** Get-Date (date) [#o2c21c2e]

|オプション|説明|h
|-Format '''format'''|表示形式を指定する|
~
|フォーマット|説明|h
|yyyy|西暦 4 桁|
|MM|月 2 桁|
|MMM|月 英語 3 文字|
|MMMM|月 英語|
|dd|日 2 桁|
|ddd|曜日 英語 3 文字|
|dddd|曜日 英語|
|HH|時 2 桁 (24 時間表記)|
|HH|時 2 桁 (12 時間表記)|
|mm|分 2 桁|
|ss|秒 2 桁|
~
||説明|h
|(Get-Date).dayofyear|1 年の何日目かを出力|
|(Get-Date).ToUniversalTime()|UTC 時間に変換する|
|(Get-Date).AddSeconds('''n''')|'''n''' 秒先を出力する (マイナスだと遡る)|
|(Get-Date).AddMinutes('''n''')|'''n''' 分先を出力する (マイナスだと遡る)|
|(Get-Date).AddHours('''n''')|'''n''' 時間先を出力する (マイナスだと遡る)|
|(Get-Date).AddDays('''n''')|'''n''' 日先を出力する (マイナスだと遡る)|
|(Get-Date).AddMonths('''n''')|'''n''' ヶ月先を出力する (マイナスだと遡る)|
|(Get-Date).AddYears('''n''')|'''n''' ヶ年先を出力する (マイナスだと遡る)|
*** Add-Content [#cf602d44]
- ファイルへのリダイレクト


*** Start-Sleep (sleep) [#h509f08d]


* .NET Framework Method [#c9015ca5]
*** Split [#c39d0c3e]
- ex) スペースで分割する
#pre(soft){{
PS C:\> "aa bb  cc".Split()
aa
bb

cc
}}
- ex) スペースで分割した上で、空白行を削除する
#pre(soft){{
PS C:\> "aa bb  cc".Split(,[StringSplitOptions]::RemoveEmptyEntries)
aa
bb
cc
}}
- ex) カンマで分割する
#pre(soft){{
PS C:\> "aa,bb,cc".Split(",")
aa
bb
cc
}}
*** ToUpper, ToLower [#q545345f]

- 大文字に変換する
#pre(soft){{
PS C:\IIJ> "aaa".ToUpper()
AAA
}}
- 小文字に変換する
#pre(soft){{
PS C:\IIJ> "AAA".ToLower()
aaa
}}



#br
#adsense(728x90)
#br

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS