2017-06-02 12 views
2

特定のモジュール(.psm1)を参照するスクリプトファイルのリストを見つける方法はありますか?つまり、スクリプトコードで、モジュールで定義されているコマンドレットを少なくとも1つ使用するすべてのファイルを取得します。特定のPowerShellモジュールへの参照を取得

明らかに、PowerShell 3.0以降では、スクリプトファイルのほとんどがコード内の明示的なImport-Module MODULE_NAMEをコードに持たないため、そのテキストを検索に使用することはできません。

Get-ChildItem -Path '...' -Recurse | Select-String 'TextToSearchFor'を使用してファイル内の特定の文字列を検索できますが、これはモジュールの任意のコマンドレットへの参照を検索するのと同じではありません。モジュール内のすべての単一のコマンドレットを検索できましたが、より良い方法があるかどうかは疑問でした。

説明:私は1つのファイルの場所にすべてのスクリプトがある制御された環境の内部を調べています。

+1

PowerShellは静的言語ではありません。文字通り、スクリプトを見るだけで、環境を制御するか、スクリプトに明示的な '#requires 'が含まれていない限り、' Verb-Noun'コマンドレットが任意の環境から来るようになります。 )。それで、文字列のマッチングは本当にアプローチの悪いことではありません。もっと複雑なものは、はるかに正確な結果を返す可能性は低いです(そして、スクリプトが鈍っていれば、問題は一般的には解決できません)。 –

+0

これを達成するための100%確実な方法はありません。 ASTを使用してファイルを解析することはできますが、スクリプトはあらかじめインポートされていないモジュールを後でインポートすることができます。実行時に新しいスクリプトを生成またはダウンロードしてからインポートすることができます。 Invoke-Expression'などがあります。最も包括的な方法は、各スクリプトを実行し、ロードされたモジュールを前後でコンパイルすることですが、エラーが発生する可能性もあります。関数がコマンドレットを参照しても関数を呼び出さない場合はどうなりますか?多分あなたはペスターと何かをしたり、嘲笑したりすることができますか? – briantist

+0

私は、1つのファイルの場所にすべてのスクリプトがある制御された環境の中を見ているだけです。文字列の検索はまだ最良の方法かもしれませんが、効率的な方法で正確に行う方法はわかりません。自分の環境で100以上のモジュールでこれを実行して、使用できないモジュールがあるかどうかを確認したかったので、それぞれのコマンドレットを手動で入力する必要はありません。 –

答えて

1

シナリオによっては、コールスタックが面白く面白いかもしれません。その場合、実行時にコールスタックに関する情報を収集し、どこかにログオンすることを知りたい機能を変更する必要があります。時間の経過とともに、いくつかの良い前提を立てるのに十分なログがあるかもしれません。

function yourfunction { 
    $stack = Get-PSCallStack 
    if ($stack.Count -gt 1) { 
     $stack[1] # log this to a file or whatever you need 
    } 
} 

これはあなたのシナリオでは全く動作しない可能性がありますが、私はオプションとして、そこにそれを投げると思いました。

関連する問題