在没有临时文件的情况下将Start-BitsTransfer与Select-String组合

时间:2018-11-11 00:59:23

标签: powershell

我正在尝试在远程文件中选择一个字符串。目前,我将文档下载到一个临时文件中,然后在其中搜索我的字符串。我正在尝试将命令通过管道传输在一起,但似乎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

进一步,是否可以在不创建变量的情况下在一行中输出第一个匹配项?

1 个答案:

答案 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的主题。