フォルダを移動したらオートで
Hatena タグ: PowerShell
今日の小ネタ。
今日、同僚がこんな感じのPowerShellスクリプトを書いてた。(WindowsPowerShell/profile.ps1 の中に書いて、PowerShell起動時に自動で読まれるようにしてた。)
というか、「PowerShellの細かい文法教えろ」って呼び出されて、一緒にスクリプト書いてた。
$script:IsActivated = $false
$script:originalPrompt = (Get-Command Prompt).ScriptBlock
function Prompt()
{
if(-not $script:IsActivated)
{
if($(pwd) -match ‘特定のパス’)
{
$configFile = Join-Path $(pwd) ‘設定ファイル名’$path = cat $configFile |
%{ if($_ –match ‘paths*=(?<v>.*)’) { $matches.v } }
$env:Path += ‘;’ + $path$script:IsActivated = $true;
}
}& $script:originalPrompt
}
どういうものかというと、
- Prompt関数を上書きすることで、フォルダを移動した瞬間を拾う。(それ以外も拾っちゃうけど)
- 特定のフォルダに移動したときに、設定ファイルを読み込んで、
- 設定中のパス設定を、環境変数のPATHに追加。
- 1回だけその処理をしたいので、フラグ立てて終了。
- プロンプトの内容自体は上書きしたくないので、前のPromptの内容を覚えておいて、それを呼び出す。
上から順に、簡単な説明:
- Prompt関数
- プロンプト表示は、実はPrompt関数が毎度呼び出されてる → Prompt関数を上書きしちゃえばフォルダを移動した瞬間も拾える。
- フォルダ判定
- pwd (Get-Location に対するエイリアス)で今いるフォルダのパスを取れる。
- $(pwd) –match ‘パス’ で特定のパスにいるかどうか判定
- 設定ファイルから値を取得
- cat(Get-Content に対するエイリアス)でファイルの中身取る。
- $_ –match ‘パターン’ した後は、$matches 変数に正規表現マッチの結果が入る。
- パターンのところに (?<tag>.*) って感じでtagを入れておくと、$matches.tag で()内の値を取れる。
- $IsActivated = $true でフラグ立て。PowerShellの論理値リテラルはtrueじゃなくて$trueなので注意。
- 同僚、Githubにパスを通してるせいで $IsActivated = true が構文エラーにならなくてはまってた(Githubに true.exeって実行ファイルがあるんで、これを呼んじゃってた)。
- 以前のPromptを保存
- Prompt関数上書き前に、(Get-Command Prompt).ScriptBlock で以前の中身を取得しておく。
- $originalPrompt = (Get-Command Prompt) だけだと、& $originalPrompt で上書き後のPromptを参照しちゃうので永久ループにはまる。
コメントを残す