2

ユーザーがローカル Web サーバーに保存されている powershell ps1 ファイルのリストを取得できるようにする小さな powershell スクリプトを作成しています。URL を参照すると、ディレクトリ リストが表示されます。

スクリプトには 2 つのスイッチがあります。(1) 「-i」は、単純な正規表現を使用して、指定された URL で見つかった ps1 ファイルのリストを表示します。(2) 「-m」が指定されている場合、スクリプトは目的の ps1 をプルダウンし、それを「インポート」して、現在のターミナル セッションで使用できるようにします。

:

PS C:> Demo-Module -i http://10.1.1.1/repo/

PS C:> Demo-Module -i http://10.1.1.1/repo/ -m ShareEnum.ps1

コード:

  if($i){
    if(-Not ($m)){
        $webClient = new-object System.Net.WebClient
        $webClient.DownloadString($i) -split "`n" | Select-String -Pattern '[-A-Z0-9.]+\.ps1' | % { $_.Matches | % { $_.Value } }
    }
    if($m){
        if($i.EndsWith("/") -eq "True"){
            $url = echo $i$m
            IEX (New-Object System.Net.Webclient).DownloadString($url)
        }
        else{
            $url = echo $i'/'$m
            IEX (New-Object System.Net.Webclient).DownloadString($url)
        }
    }
  }

これは単なるデモ コードであることに注意してください。ここでのロジックはエラーなしで実行されますが、その後、コマンドラインで ps1 ファイル (例: ShareEnum) を使用できなくなります。

コマンドラインから次を実行すると機能します。

PS C:> IEX (New-Object System.Net.Webclient).DownloadString('http://10.1.1.1/ShareEnum.ps1')
PS C:> Get-Help ShareEnum   # The script is loaded in the current terminal session

どんな助けでも大歓迎です。

説明:

私が達成したいことについて混乱があるように見えるので、問題を明確にしたいだけです。この質問は、ps1 スクリプトをローカルで実行する方法に関するものではありません。ps1 スクリプトを Web サーバーでホストし、現在の PowerShell ターミナル セッションに直接ロードできるという考えです。

以下のどちらもまったく同じ効果があります。

ShareEnum をリモートで読み込んでいます:

PS C:> IEX (New-Object System.Net.Webclient).DownloadString('http://10.1.1.1/ShareEnum.ps1')

ローカルでドットソーシングする ShareEnum:

PS C:> . .\ShareEnum.ps1

上記の例は完全に機能します。問題は、デモ コードで $url 変数が WebClient によって正しく解釈されていないことだと思います。スクリプトはエラーを表示せずに終了しますが、実行後、現在の PowerShell ターミナル セッション内で ShareEnum を呼び出すことはできません。

4

1 に答える 1

1

まあ..問題が実際に何であるかを理解しましたが、新しい問題が残ります。上記のコードは意図したとおりに機能しますが、「インポートされた」リモート スクリプトはスクリプト スコープに関連付けられており、コードの実行が終了してスクリプトが終了すると、インポートされたスクリプトは削除されます。

この問題には汚い解決策があります。関数がグローバル関数として設定されるように、リモート ps1 を編集する必要があります。このようにして、スクリプトが終了しても、リモートの ps1 ファイルは現在のセッションにまだロードされています。

function global:ShareEnum
{
...
}

これは素晴らしいことではありません。理想的には、Demo-Module がこれを単独で処理する必要があります。誰かがこの問題を解決するためのより良い方法を見つけることができるかどうかを確認するために、この質問をしばらく開いたままにします.

于 2014-12-27T12:18:19.070 に答える