从HTTP下载脚本并使用Powershell使用参数运行脚本的最短方法是什么?

问题描述 投票:-2回答:2

我在内部工件服务器中存储了一个PowerShell脚本文件。脚本URL为http://company-server/bootstrap.ps1

下载该脚本并使用自定义参数执行的简洁方法是什么?

我想将这样的命令发送给用户,用户将一遍又一遍地复制粘贴该命令,因此该命令必须为单行且应简短。

我目前拥有的作品,但是很长很笨拙:

$c=((New-Object System.Net.WebClient).DownloadString('http://company-server/bootstrap.ps1'));Invoke-Command -ScriptBlock ([Scriptblock]::Create($c)) -ArgumentList 'RunJob'

我想知道是否有更短的方法来做到这一点。

powershell
2个回答
1
投票

一个简短的表达形式,[可能是这样,它利用了:

    irm代替Invoke-RestMethod代替(New-Object System.Net.WebClient).DownloadString()
  • 在不必要的地方省略引号
  • 依赖于位置参数绑定
  • & ([scriptblock]::Create((irm http://company-server/bootstrap.ps1))) RunJob

    [RunJob是要传递给脚本的OP的自定义参数。

    甚至更短一些,但也许更晦涩的方法是使用iex

  • ,这是Invoke-Expression的内置别名,由this GitHub comment提供。iex "& { $(irm http://company-server/bootstrap.ps1) } RunJob"

    顺便说一句:一般使用Invoke-Expression should be avoided

    该命令使用可扩展字符串("...",字符串插值)创建一个字符串,该字符串的远程脚本的

    content括在脚本块{ ... }中,然后在子作用域(&中调用)。请注意,传递给脚本的参数必须是inside "..."


    但是,有一个

    一般警告

    (这似乎对您来说不是问题):如果脚本以exit终止,则调用PowerShell实例也退出了]] >。有两个

    解决方法


    子进程

    中运行脚本:
    powershell { iex "& { $(irm http://company-server/bootstrap.ps1) } RunJob" }
    注意事项:

    • 以上内容仅可在PowerShell中使用;从PowerShell外部,必须使用powershell -c "..."而不是powershell { ... },但是请注意,如果需要,请正确转义

      embedded

      双引号(对于带有PS元字符和/或带有空格的自定义参数的URL) ,可能会很棘手。
  • 如果脚本旨在修改调用者的环境,则修改将由于在子进程中运行而丢失。

  • 首先将脚本保存到临时文件:

    注意:该命令分散在多行上,以提高可读性,但它也可以作为一种代码使用:

    & { $f = Join-Path ([IO.Path]::GetTempPath()) ([IO.Path]::GetRandomFileName() + '.ps1'); irm http://company-server/bootstrap.ps1 > $f; & $f RunJob; ri $f }

    明显的缺点是该命令要长得多。

    请注意,该命令在编写时要考虑到健壮性和跨平台兼容性,因此它在所有受支持的平台上都可以在PowerShell

    Core

    中使用。根据您需要支持的平台/您愿意做出的假设(例如,当前目录是可写的),可以缩短该命令。

    潜在的未来增强功能

    This GitHub issue,自PowerShell Core 6.2.0-preview.4起编写,自PowerShell Core 7.0起修订,建议增强Invoke-Commandicm)cmdlet,以大大简化下载脚本和执行方案,这样您就可以按以下方式调用有问题的脚本:

    # WISHFUL THINKING as of PowerShell Core 7.0 # iwr is the built-in alias for Invoke-WebRequest # icm is the built-in alias for Invoke-Command. iwr http://company-server/bootstrap.ps1 | icm -Args RunJob

    This GitHub issue更进一步,建议创建RFC以引入新的PowerShell 

    provider

    ,该URL允许在以前仅接受文件的地方使用URL,从而启用诸如以下的调用:
    # WISHFUL THINKING as of PowerShell Core 7.0 & http://company-server/bootstrap.ps1 RunJob
    但是,尽管这些选项非常方便,但是要考虑

    安全隐患


    0
    投票
    这里是一个较短的解决方案(158个字符。)
    © www.soinside.com 2019 - 2024. All rights reserved.