ユーザーがローカル 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 を呼び出すことはできません。