特別インストール作業をすることなくWindows10パソコンで有ればシェルを起動しスクリプトを実行はもちろんのこと開発環境のIDEも即実行可能です。スクリプト言語として、まじめに学ぼうとチャレンジしてみましたが、Microsoft社の作る製品の難解さに早々に挫折しました。
とはいえ便利であることは間違いないので、とりあえず動いて自分に役に立つスクリプトを書き散らかしています。こちらの記事ではPowersehllのスクリプトを作成する上で基本的な内容を随時更新していきたいと思います。
比較演算子
-eq
==
等しい-ne
!=
等しくない-gt
>
より大きい-ge
>=
以上-lt
<
より小さい-le
<=
以下
数学の記号的表記ではなく英文の短縮系の表記です。
比較演算子は良く使うので、記号として暗記すべきところですが、物覚えが悪く覚えれられません。
しかたがないので、自分の知っている適当な英単語を組合せ文法の怪しい英文を作りそれを覚えるようにしています。
- 等しい→equal→eq
- 等しくない→not equal→ne
- より大きい→greater than→gt
- より小さい→less than→lt
- 以上→より大きい又は等しい→greater than or equal to→ge
- 以下→より小さい又は等しい→less tahn or equal to→le
関数の呼び出し
オブジェクトのメソッドはカッコが必須。
標準出力及び標準エラー出力のファイルへのリダイレクト
標準エラー出力をファイルへリダイレクト
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
このps1ファイルにユーザー環境構築用のコードを記述すると便利です。
具体的にはAiliasの定義や環境変数の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形式でアーカイブしたりできる。
コメント