我正在编写一个小型 powershell 脚本,它允许用户下拉存储在本地网络服务器上的 powershell ps1 文件列表。浏览到 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 脚本可以托管在网络服务器上并直接加载到当前的 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。