我正在尝试在远程文件中选择一个字符串。目前,我将文档下载到一个临时文件中,然后在其中搜索我的字符串。我正在尝试将命令通过管道传输在一起,但似乎Start-BitsTransfer需要一个目标文件。我可以在没有临时文件的情况下执行此操作吗?
Start-BitsTransfer -Source https://www.remoteserver/file.html -Destination C:\temp.html
$matches = Get-Content C:\temp.html -ErrorAction SilentlyContinue | Select-String '(http.*pdf)'
$matches[0].Matches.Groups[1].Value
进一步,是否可以在不创建变量的情况下在一行中输出第一个匹配项?
答案 0 :(得分:2)
似乎Start-BitsTransfer需要一个目标文件。我可以在没有临时文件的情况下执行此操作吗?
否,因为PowerShell没有等效于Bash输出过程替换(>(...)
) [1] 的构造,这是您在这里需要的:
# Wishful thinking - does NOT work.
Start-BitsTransfer -Source https://www.remoteserver/file.html -Destination `
>(Select-String '(http.*pdf)')
但是,您可以使用Invoke-RestMethod
通过HTTP检索基于文本的文件(例如HTML页面)并将其内容输出到成功流,因此可以将其通过管道传递给其他命令:
Invoke-RestMethod -UseBasicParsing https://www.remoteserver/file.html |
Select-String '(http.*pdf)'
是否可以在不创建变量的情况下在一行中输出第一个匹配项?
是的,您可以使用ForEach-Object
调用来提取感兴趣的捕获组:
Invoke-RestMethod -UseBasicParsing https://www.remoteserver/file.html |
Select-String -List '(http.*pdf)' |
ForEach-Object { $_.Matches[0].Groups[1].Value }
请注意,-List
使Select-String
在找到匹配项的第一行之后停止,即在输入中的第一个匹配项之后;忽略它可以找到文件中的所有匹配项(每行一个;要找到每行多个匹配项,请添加-AllMatches
)。
[1]使PowerShell支持进程替代是此feature request on GitHub的主题。