首页 > 解决方案 > 如何使用 Powershell 将 curl 命令的结果通过管道传输到 tar?

问题描述

我目前正在尝试在 Windows Powershell 中运行以下命令:

curl https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.65/bin/apache-tomcat-8.5.65.tar.gz | tar xvz --strip-components=1 - -C ~/tomcat-8.6.65

当我运行此命令时,它会尝试解压缩默认值\\.\tape0而不是 Tomcat 压缩包。我知道一种解决方法是使用 -f 指定文件名,但是当我从 URI 中提取文件时,我不知道这将如何实现。有没有人有解决方案来使这个命令工作?

标签: windowspowershellcurltar

解决方案


  • PowerShell 仅通过文本(字符串)与外部程序通信,它不支持原始字节流;有关更多信息,请参阅此答案

  • Windows PowerShell中(但不再在PowerShell (Core) 7+中),是cmdletcurl的内置别名;Invoke-WebRequest要改为调用外部curl.exe程序,请使用curl.exe,即包含文件扩展名.

由于您确实需要原始字节流处理,因此不能选择使用PowerShell管道,但您可以委托给cmd.exe

# Make sure that the target dir. exists and get its full path.
# (If the target dir. doesn't exist, tar's -C option will fail.)
$targetDir = (New-Item -Force -ErrorAction Stop -Type Directory $HOME/tomcat-8.6.65).FullName

# Invoke cmd.exe's binary pipeline, passing the target dir.
# As an aside: tar.exe on Windows does NOT know that ~ refers to the 
#              user's home dir.
cmd /c @"
curl https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.65/bin/apache-tomcat-8.5.65.tar.gz | tar xvz --strip-components=1 -f - -C "$targetDir"
"@

以上还纠正了您的tar命令的语法问题:-应该是-f -.


推荐阅读