none
特定の関数やスクリプトのみの実行履歴を取得したいです。 RRS feed

  • 質問

  • 自分で作った関数やスクリプトの同一セッション下の実行回数や最新の実行日時に基づいた処理を行いたいのですが、Get-Historyコマンドレットは実行したコマンドを文字列として扱うために特定のコマンドのみの履歴を抽出するのが非常に難しいです。正規表現を使えばある程度は絞り込みが可能なのですが、例えばabcdef.ps1という名前のスクリプトを

    $name = '.\a' + 'bcd' + 'ef.p' + 's1'
    & $name
    

    などとして名前を計算で導出して実行したりすれば正規表現などでの検出はほとんど不可能になってしまいます。

    また、実行回数や実行日時をグローバル変数として用意して関数やスクリプト側からこれに記録するやり方では、うっかり外部からこの変数を書き換えてしまったりすれば意味をなさなくなってしまいます。

    目的としては、同一セッション下で1回だけ実行すればよい関数やスクリプトを2回以上実行するとエラーを投げるように実装したり、実行する順序の決まった関数やスクリプトがある場合に前提条件の関数やスクリプトが実行済みかをチェックしたりすることです。

    2018年11月16日 3:13

回答

  • 同一セッションで実行されたコマンド履歴を抽出するというのは中々難しそうですので、やはりグローバル変数に実行履歴を保持しておくのが良いのではないでしょうか?

    $global:val = "値" のように代入するのではなく、

    Set-Variable -Scope global -Option ReadOnly -Name val -Value "値" -Force

    のように、読み取り専用の変数としてやれば、うっかり書き換えられるということはなくなるかと思います。

    (ちなみに-Visibility Private と指定することで、コンソールからは値の参照も不可にすることもできます)

    もっともコンソールでSet-Variable -Forceを実行してしまえば上書きは可能ですが、「うっかり」ではそこまでしないでしょうし、現実的な落としどころになるかと思います。

    なお、スクリプトやコマンドを実行する順序や回数が決まっているのなら、ユーザーに手動で実行させず、コマンド、スクリプト実行を含む全体の処理を、そのままスクリプトにしてしまうのが一番安全かつ合理的であるとも思いました。

    • 回答としてマーク fzok4234 2018年11月21日 13:03
    2018年11月20日 9:24
    モデレータ

すべての返信

  • 同一セッションで実行されたコマンド履歴を抽出するというのは中々難しそうですので、やはりグローバル変数に実行履歴を保持しておくのが良いのではないでしょうか?

    $global:val = "値" のように代入するのではなく、

    Set-Variable -Scope global -Option ReadOnly -Name val -Value "値" -Force

    のように、読み取り専用の変数としてやれば、うっかり書き換えられるということはなくなるかと思います。

    (ちなみに-Visibility Private と指定することで、コンソールからは値の参照も不可にすることもできます)

    もっともコンソールでSet-Variable -Forceを実行してしまえば上書きは可能ですが、「うっかり」ではそこまでしないでしょうし、現実的な落としどころになるかと思います。

    なお、スクリプトやコマンドを実行する順序や回数が決まっているのなら、ユーザーに手動で実行させず、コマンド、スクリプト実行を含む全体の処理を、そのままスクリプトにしてしまうのが一番安全かつ合理的であるとも思いました。

    • 回答としてマーク fzok4234 2018年11月21日 13:03
    2018年11月20日 9:24
    モデレータ
  • 回答ありがとうございます。

    読み取り専用変数も-Forceオプションで書き換えできたのですね。とりあえず実行履歴は読み取り変数に保存する方向で検討してみます。

    2018年11月21日 13:07