++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

フォルダを移動したらオートで

leave a comment »

Hatena タグ:

今日の小ネタ。

今日、同僚がこんな感じの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
}

どういうものかというと、

  1. Prompt関数を上書きすることで、フォルダを移動した瞬間を拾う。(それ以外も拾っちゃうけど)
  2. 特定のフォルダに移動したときに、設定ファイルを読み込んで、
  3. 設定中のパス設定を、環境変数のPATHに追加。
  4. 1回だけその処理をしたいので、フラグ立てて終了。
  5. プロンプトの内容自体は上書きしたくないので、前のPromptの内容を覚えておいて、それを呼び出す。

上から順に、簡単な説明:

  1. Prompt関数
    1. プロンプト表示は、実はPrompt関数が毎度呼び出されてる → Prompt関数を上書きしちゃえばフォルダを移動した瞬間も拾える。
  2. フォルダ判定
    1. pwd (Get-Location に対するエイリアス)で今いるフォルダのパスを取れる。
    2. $(pwd) –match ‘パス’ で特定のパスにいるかどうか判定
  3. 設定ファイルから値を取得
    1. cat(Get-Content に対するエイリアス)でファイルの中身取る。
    2. $_ –match ‘パターン’ した後は、$matches 変数に正規表現マッチの結果が入る。
    3. パターンのところに (?<tag>.*) って感じでtagを入れておくと、$matches.tag で()内の値を取れる。
  4. $IsActivated = $true でフラグ立て。PowerShellの論理値リテラルはtrueじゃなくて$trueなので注意。
    1. 同僚、Githubにパスを通してるせいで $IsActivated = true が構文エラーにならなくてはまってた(Githubに true.exeって実行ファイルがあるんで、これを呼んじゃってた)。
  5. 以前のPromptを保存
    1. Prompt関数上書き前に、(Get-Command Prompt).ScriptBlock で以前の中身を取得しておく。
    2. $originalPrompt = (Get-Command Prompt) だけだと、& $originalPrompt で上書き後のPromptを参照しちゃうので永久ループにはまる。

Written by ufcpp

2009年5月13日 @ 13:59

カテゴリー: 未分類

コメントを残す