powershell 你能把字符串或变量通过管道传输到下载的.ps1文件中吗?

j8ag8udp  于 2023-01-13  发布在  Shell
关注(0)|答案(1)|浏览(135)

我在Dropbox上托管了包含以下内容的文件:(我知道它目前没有调用任何东西)

function test_echo {

[CmdletBinding()]
param ( 
[Parameter (Position=0,Mandatory = $True, ValueFromPipeline = $True)]
[string]$e
) 

echo $e
}

在下载和执行文件之前,是否有办法将信息通过管道传输到该文件中?
例如:
"test" | iwr DropBoxLink | iex
并将此回声输出test
老实说,这可能没有实际应用,但我发现自己想知道是否有可能,所以我想问。
我知道我可以先将字符串定义为变量,然后执行它,但我只想知道,出于原则考虑,您是否可以通过管道传输它
$testEcho = "string"; iwr DropBoxLink | iex
> string

5uzkadbs

5uzkadbs1#

"test" | % -begin { iex (irm $DropBoxUrl) } -process { $_ | test_echo }
  • 上面的代码使用ForEach-Object调用的-Begin块来下载和评估脚本(通常的iexInvoke-Expression)警告适用-您应该信任源代码),该脚本定义了下载脚本中包含的test_echo函数。
  • -Begin脚本块在处理管道输入 * 之前 * 执行,这意味着在-Process脚本块处理(每个)管道输入对象时,test_echo函数已经定义。
  • 还要注意,这里使用的是irmInvoke-RestMethod),而不是iwrInvoke-WebRequest),因为您只对脚本的 * 内容 * 感兴趣。

当然,这不会给您带来太多好处,因为您可以简单地使用 * 两个 * 语句,这有一个额外的好处,即 * 所有 * 管道输入(如果有多个输入对象)都由 * 单个 * test_echo调用处理:

iex (irm $DropBoxUrl) # Download and effectively dot-source the script.
"test" | test_echo    # Pipe to the script's `test_echo` function.

一般警告是,如果下载的脚本包含在求值过程中命中的exit语句,* 调用shell* 将 * 作为一个整体 * 退出。

  • 由于实际上您需要对下载的脚本进行dout-source以使其功能可用,因此解决exit问题的唯一方法是首先 * 下载到一个(临时)文件 *,然后进行dout-source *。
  • 如果不需要点源,可以选择通过PowerShell CLI(子进程)调用-请参阅下文。
  • GitHub issue #5909提出了一个未来的增强功能,允许将Invoke-WebRequestiwr)调用通过管道传输到Invoke-Commandicm),以便直接从Web下载和执行,而不会出现exit问题(iwr $DropboxLink | icm)。

请注意,如果下载的脚本直接接受管道输入*,则可以如下所示使用[scriptblock]::Create()Invoke-Expression不是一个选项,因为它不接受管道输入):

# Assumes that the script located at $DropBoxUrl
# *itself* accepts pipeline input.
# Use . (...) if you want to *dot-source* the script, as 
# Invoke-Expression would implicitly do.
"test" | & ([scriptblock]::Create((irm $DropBoxUrl))

要解决exit问题,可以通过CLI和脚本块调用,在本例中使用pwsh,即PowerShell(Core)7+ CLI;对Windows PowerShell使用powershell.exe

# Assumes that the script located at $DropBoxUrl
# *itself* accepts pipeline input.
'test' | 
  pwsh -NoProfile { 
    $input | & ([scriptblock]::Create($args[0])) 
  } -args (irm $DropBoxUrl)

相关问题