我正在编写一个小的PowerShell脚本,允许用户下载存储在本地Web服务器上的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)
}
}
}
请记住,这只是一些演示代码。此处的逻辑运行时没有任何错误,但之后psl文件(例如: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
上面的例子非常有效。我认为,问题是我的演示代码中的WebClient没有正确解释$ url变量。脚本退出时不显示任何错误,但在运行后,无法在当前的powershell终端会话中调用ShareEnum。
答案 0 :(得分:0)
嗯..我已经弄明白问题究竟是什么,但它给我留下了一个新问题。上面的代码按预期工作,但是"导入"远程脚本与脚本范围相关联,当代码完成运行并且脚本退出时,导入的脚本将被删除。
这个问题有一个肮脏的解决方案。需要编辑远程ps1,以便将该功能设置为全局功能。这种方式当脚本退出远程ps1文件时仍会在当前会话中加载。
function global:ShareEnum
{
...
}
这不是很好,理想情况下,演示模块应该自己处理。我会暂时搁置这个问题,看看是否有人能找到更好的方法来解决这个问题。