PowerShellのあれこれ

PoweShell コンピュータ
PowerShell
沢山あるシェルやスクリプト言語の中でPowerShellを使う理由があるとしたらWindows10の標準のシェルで有る点です。
特別インストール作業をすることなくWindows10パソコンで有ればシェルを起動しスクリプトを実行はもちろんのこと開発環境のIDEも即実行可能です。スクリプト言語として、まじめに学ぼうとチャレンジしてみましたが、Microsoft社の作る製品の難解さに早々に挫折しました。
とはいえ便利であることは間違いないので、とりあえず動いて自分に役に立つスクリプトを書き散らかしています。こちらの記事ではPowersehllのスクリプトを作成する上で基本的な内容を随時更新していきたいと思います。

比較演算子

-eq
==等しい
-ne
!=等しくない
-gt
>より大きい
-ge
>=以上
-lt
<より小さい
-le
<=以下

数学の記号的表記ではなく英文の短縮系の表記です。
比較演算子は良く使うので、記号として暗記すべきところですが、物覚えが悪く覚えれられません。
しかたがないので、自分の知っている適当な英単語を組合せ文法の怪しい英文を作りそれを覚えるようにしています。

  1. 等しい→equal→eq
  2. 等しくない→not equal→ne
  3. より大きい→greater than→gt
  4. より小さい→less than→lt
  5. 以上→より大きい又は等しい→greater than or equal to→ge
  6. 以下→より小さい又は等しい→less tahn or equal to→le

関数の呼び出し

関数の呼び出しの記述では、引数の前後のカッコは無し。CUIのコマンドの引数と同じ記述。
オブジェクトのメソッドはカッコが必須。

標準出力及び標準エラー出力のファイルへのリダイレクト

標準エラー出力をファイルへリダイレクト

PS>powershell.exe ./scriptname.ps1 2>./error.log

標準出力と標準エラー出力をファイルへリダイレクト

PS>powershell.exe ./scriptname.ps1 2>&1 >> ./scriptname.log

powershell.exeのオプション

-NoLogo
起動時にpowersehllのロゴを表示しない。標準出力をLogファイルに出力する場合で、ロゴが邪魔な場合に使う。
-NoExit
スクリプトを実行後powersehll.exeを終了しない。
スクリプトへのショートカットでコンソールの標準主力やエラーを確認した場合に使う。このオプションを付けないと終了するスピードが速すぎてコンソール文字を判別出来ない場合とか。
-NoProfile
プロファイルを読み込まない
-File <スクリプトファイルのパス>
実行するps1ファイルを指定する。

外部コマンドを実行するコマンドレット

# Start-Process

#オプション
# -FilePath 実行ファイルのパス
# -ArgumentList 実行ファイルの引数
# -Wait コマンドの終了をまつ。
# -PassThru 結果をオブジェクトで返す。
# -RedirectStandardOutput 標準出力
# -RedirectStandardError 標準エラー
# -NoNewWindow ウィンドウを新たに開かない

パス関連

カレントディレクトリを取得

Get-Location

パスからファイル名を取得

Split-Path パス -Leaf

パスから親ディレクトリを取得

Split-Path パス -Parent

パスから拡張子を取得

[System.IO.Path]::GetExtension(パス)

パスからベース名(拡張子を除いたファイル名)を取得

[System.IO.Path]::GetFileNameWithoutExtension(パス)

CPU使用率を取得

<#
.SYNOPSIS
CPUの使用率を取得
.DESCRIPTION
CPU全コアスレッドの使用率の合計値
.EXAMPLE
.\Get-CPUUsageRate.ps1
#>
$ErrorActionPreference = "STOP"
 Get-WmiObject Win32_PerfFormattedData_PerfOS_Processor | ? {$_.Name -eq "_Total" } | % { $_.PercentProcessorTime }

本日アクセスしたファイルの一覧

<#
.SYNOPSIS
本日アクセスしたファイルを取得
.DESCRIPTION
Documentsフォルダ下のファイルを検索
.EXAMPLE
.\Get-TodayAccessFile.ps1
#>
$ErrorActionPreference = "STOP"
Get-ChildItem -LiteralPath (Join-Path $env:USERPROFILE "\Documents") -Recurse | ? { $_.LastAccessTime -gt (Get-Date -Date (Get-Date).ToString('yyyy-MM-dd 00:00:00')) } | % { $_ }

エイリアスの検索

名前(エイリアス)で検索
Get-Alias -Name cat
実名を検索
Get-Alias -Definition Get-Content

特殊変数

$_
ForEach-Objectで使われる現在のオブジェクトを表す変数
$input
スクリプト渡されたパイプライン。@($input)配列へ変換してアクセス
$PSScriptRoot
実行しているスクリプトのディレクトリ
$PSCommandPath
実行しているスクリプトのパス

現在の日時を文字列で取得

(date).ToString("yyyyMMddHHmmss")

スクリプトのヘルプを表示

<#
.SYNOPSIS
 スクリプトの要約

.PARAMETER Help
ヘルプメッセージを表示。

#>

Param(
    [switch]$Help
)

$args = @($input)

if ($Help -Or ($args.Count -eq 0))
{
    Get-Help $PSCommandPath
    Exit 1
}

コメント

ユーザー環境設定$profile

特殊変数$profileにはシェルを起動した際自動的に実行されるps1ファイルのPATHがセットされています。
このps1ファイルにユーザー環境構築用のコードを記述すると便利です。
具体的にはAiliasの定義や環境変数のPATHの定義などになります。
PowerShellの$profileにエイリアスを設定しておくと便利で良い。
PowerShellの$profileはPowerShell.exeやPowerShell_ISE.exeなどを起動した際、読み込まれ実行されるスクリプトファイルへのパスが格納されています。PowerShell.exeからise $prof...

環境変数のPATHをPowerShell内でのみ適用される設定にする。
システムやユーザー環境変数ではなくPowerShellの起動時に一時的な環境変数としてPATHを切ってあげようという話です。実行環境Windows10PowerShell version 5.1メリット環境変数PATHの設定を失敗しても影響...

よく使うfilterやfunctionの定義をするのも良いでしょう。
筆者の定番$profile

$ScriptDir = Split-Path $profile -Parent 
$Env:Path = $Env:Path + ";" + $ScriptDir

$BinDir = "$Env:Userprofile\Bin"
if (-not (Test-Path -LiteralPath $BinDir))
{
    New-Item -Path $BinDir -ItemType Directory | Out-Null
}
$Env:Path = $Env:Path + ";" + $BinDir

ps1スクリプトの保存用ディレクトリを$ScriptDirにセットします。
PS>cd $ScriptDirと入力することでスクリプトがあるディレクトリに移動できます。

次に$ScriptDirを環境変数のPATHに追加します。PATHが切られることで$ScriptDir内にある.ps1スクリプトをファイル名のみで実行することが出来ます。

$ScriptDirと同様に.exeファイルを置くディレクトリを$BinDirという変数にセットしています。
$BinDirはユーザーディレクトリの下にBinというディレクトリを作成しPATHを切ってあげます。
自作の.exeファイルのインストール先にします。

指定日時より以前のファイルを検索

ls -file | ? { $_.LastWriteTime -lt (Get-Date).AddDays(-30) }

例では30日以前のファイルを検索。使い道としてはパイプラインでつなげて、検索結果をrmで削除したり、Compress-Archive -DestinationPath 出力先のPATHでzip形式でアーカイブしたりできる。

コメント