我在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
1条答案
按热度按时间5uzkadbs1#
ForEach-Object
调用的-Begin
块来下载和评估脚本(通常的iex
(Invoke-Expression
)警告适用-您应该信任源代码),该脚本定义了下载脚本中包含的test_echo
函数。-Begin
脚本块在处理管道输入 * 之前 * 执行,这意味着在-Process
脚本块处理(每个)管道输入对象时,test_echo
函数已经定义。irm
(Invoke-RestMethod
),而不是iwr
(Invoke-WebRequest
),因为您只对脚本的 * 内容 * 感兴趣。当然,这不会给您带来太多好处,因为您可以简单地使用 * 两个 * 语句,这有一个额外的好处,即 * 所有 * 管道输入(如果有多个输入对象)都由 * 单个 *
test_echo
调用处理:一般警告是,如果下载的脚本包含在求值过程中命中的
exit
语句,* 调用shell* 将 * 作为一个整体 * 退出。exit
问题的唯一方法是首先 * 下载到一个(临时)文件 *,然后进行dout-source *。Invoke-WebRequest
(iwr
)调用通过管道传输到Invoke-Command
(icm
),以便直接从Web下载和执行,而不会出现exit
问题(iwr $DropboxLink | icm
)。请注意,如果下载的脚本直接接受管道输入*,则可以如下所示使用
[scriptblock]::Create()
(Invoke-Expression
不是一个选项,因为它不接受管道输入):要解决
exit
问题,可以通过CLI和脚本块调用,在本例中使用pwsh
,即PowerShell(Core)7+ CLI;对Windows PowerShell使用powershell.exe
: