Powershell IEX不导入模块

时间:2014-12-26 21:07:32

标签: powershell webclient downloadstring

我正在编写一个小的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。

1 个答案:

答案 0 :(得分:0)

嗯..我已经弄明白问题究竟是什么,但它给我留下了一个新问题。上面的代码按预期工作,但是"导入"远程脚本与脚本范围相关联,当代码完成运行并且脚本退出时,导入的脚本将被删除。

这个问题有一个肮脏的解决方案。需要编辑远程ps1,以便将该功能设置为全局功能。这种方式当脚本退出远程ps1文件时仍会在当前会话中加载。

function global:ShareEnum
{
...
}

这不是很好,理想情况下,演示模块应该自己处理。我会暂时搁置这个问题,看看是否有人能找到更好的方法来解决这个问题。