PowerShell †
- Windows_PowerShell - wikipedia
- Windows PowerShell は、マイクロソフトが開発した拡張可能なコマンドラインインターフェース (CLI) シェルおよびスクリプト言語である。オブジェクト指向に基づいて設計されており、.NET Framework 2.0 を基盤としている。
長い行の改行 †
PowerShellでtcp疎通確認 †
- Test-NetConnectionを使う場合。ICMPを使ってるため、ICMPを閉じている場合少し待たされる。
Windowsのバージョン取得 †
stdout, stderrのリダイレクト †
- About Redirection
- shell scriptのように「2>&1」のような指定はできるが、2より上の値があり、Write-Hostを含むログをファイルに出すためには「*>」を指定する
- 追記は「*>>」
returnの罠 †
- 普通のプログラミング言語では"func2"だけ出力されるはずが、期待が違う
- 関数の呼び出し時に必ず変数で受取るようにすると、望んだ結果になる
変数のダンプ †
- jsonで出力
$var1 | ConvertTo-Json
try catch中の行番号の表示 †
try{
}
catch {
$e = $_.Exception
$line = $_.InvocationInfo.ScriptLineNumber
Write-Host -ForegroundColor Red "caught exception: $e at $line"
}
相対パスを絶対パスへ変換 †
echo (Convert-Path ".\example.log")
C:\tmp\example.log
設定ファイルや関数を別ファイルにして読み込む †
- example-conf.ps1
$config_var1="hoge"
Get-Date: 日付と時刻 †
# localtime
Get-Date
2020年4月2日 16:45:32
# UTC
(Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:sszzz")
2020-04-02T08:03:27+09:00
# iso-8601
Get-Date -Format "o"
2020-04-02T16:56:30.9156570+09:00
# 文字列へ
(Get-Date).ToString()
2020/04/02 16:50:00
# 任意の書式へ
(Get-Date).ToString("yyyy-MM-ddTHH:mm:sszzz")
2020-04-02T17:01:17+09:00
Test-Path: ファイル、ディレクトリ、レジストリの存在チェック †
Write系コマンドレット †
- Write-Host "message"
- ホスト画面へ出力。リダイレクトできない
- -NoNewline : 改行なし
- Write-Warning "message"
- ホスト画面へ「WARNING: message」と出力
- $WarningPreference で制御。デフォルト: Continue
- Write-Verbose "message"
- -Verbose 指定時だけ出力
- $VerbosePreference で制御。デフォルト: SilentlyContinue
- Write-Debug "message"
- -Debug 指定時だけ出力して、一時停止。入力受付状態になる。
- $DebugPreference で制御。デフォルト: SilentlyContinue
- Write-Error "message"
- 赤文字で出力
- $ErrorActionPreference で制御。デフォルト: SilentlyContinue
ファイルサイズ、ディレクトリのファイル数 †
# ファイルの場合は、ファイルサイズ
(Get-ChildItem .\example.ps1).Length
987
# ディレクトリの場合は、ファイル数
(Get-ChildItem c:\tmp).Length
6
UTF8 BOMなしへ変換 †
- PowerShell 6.0以降は、デフォルトがUTF8 BOM無し
- 以下のコードはNG。ファイルサイズが大きいと遅い&メモリを大量に使用する
- 入力がBOM付きの空ファイル(3byte)だと、$OutPathが作成されないので、New-Itemで作っている。
function Utf8NoBom {
param (
[string] $InPath,
[string] $OutPath
)
Get-Content -Path $InPath -Raw -Encoding Default `
| % { [Text.Encoding]::UTF8.GetBytes($_) } `
| Set-Content -Path $OutPath -Encoding Byte
if (! (Test-Path -Path $OutPath)) {
New-Item -Type File $OutPath
}
}
Utf8NoBom ".\in.csv" ".\out.csv"
エラーの無視 †
- $ErrorActionPreference
- "Stop" : try{}catch{} したい場合
- "continue" : エラーを表示する
- "silentlycontinue" : エラーを表示しない
$ErrorActionPreference = "silentlycontinue"
# エラーを無視したいコマンド
$ErrorActionPreference = "continue"
圧縮/展開 †
入門 †
イベントログをcsv形式で出力 †
似たような関数があるが、使えるオプションが違う
- Get-WinEvent
- Get-EventLog
- Export-CSV
- -Encoding
- -NoTypeInformation
- $LogNames=@("Application","Security","System")
$LogName="Application"
$AfterDate="2020-04-02"
$CSVpath=$LogName + ".csv"
Get-WinEvent -FilterHashtable @{LogName=$LogName;level=1,2;starttime=((Get-Date).AddDays(-1))} | Select timeCreated,levelDisplayName,providerName,id,@{name="message";expression={$_.message.Replace("`n",";")}} | Export-CSV $CSVpath -Encoding UTF8 -NoTypeInformation
$AfterDate="2020-04-02"
$CSVpath=$LogName + "." + $AfterDate + ".csv"
Get-EventLog -LogName $LogName -After $AfterDate | Select timeCreated,levelDisplayName,providerName,id,@{name="message";expression={$_.message.Replace("`n",";")}}| Export-CSV $CSVpath -Encoding UTF8 -NoTypeInformation
PowerShellバージョンの確認 †
WSL(linux)のコマンドの呼び出し †
wsl.exe経由で呼び出せる。
テレメトリ(利用者の情報を収集)の無効化: †
Out-GridView: コマンド結果をテーブル形式の別ウィンドウで表示 †
Get-Process | Out-GridView
環境変数 †
ヘルプの表示 †
- 初回最新のヘルプがダウンロードされる
Get-Help
find風の結果を得る †
サービス一覧を取得 †
- スタートアップの種類は紛らわしい
- 自動:OS起動時に起動
- 手動:ポートに要求があれば自動起動
- 無効:起動を禁止
zipファイルを展開せずにファイル名やファイルサイズで検索 †
WMIからHDD SMART情報を取得 †
PowerShellの終了コードをcmd.exeに渡す †
PowerShell内で「exit 2」としても、「echo %ERRORLEVEL%」は全て"1"になる。
以下のようにすれば取得できるようだ
powershell -NoProfile -command ".\test.ps1;exit $LASTEXITCODE"
echo %ERRORLEVEL%
PowerShellを実行可能にする †
デフォルトでは実行不可になっている。