【问题标题】:gsutil - cp not processing each item in the pipelinegsutil - cp 不处理管道中的每个项目
【发布时间】:2018-11-01 02:54:25
【问题描述】:

我正在尝试创建一个小型 Powershell 脚本,它将匹配特定条件的文件列表复制到指定的 GCP 存储桶。我已经走到这一步了:

Get-ChildItem $Path | Where-Object { $_.psiscontainer -and $_.LastWriteTime -gt $Age } | Select-Object -ExpandProperty FullName | ft -hidetableheaders | gsutil -m cp -L log.log -r -n -I gs://bucket

但这只会上传列表中第一个文件夹的内容。我尝试在 gsutil 命令上使用 foreach-object,但由于找不到要上传的 URL,我收到错误消息。将 foreach 的输出写入控制台时,输出似乎完全为空。

我已经确认整行减去 gsutil 命令会从路径返回正确的文件夹,所以我知道数据正在进入管道。但我不确定为什么 gsutil 只考虑管道中的第一项。

任何帮助将不胜感激,并提前感谢您!

【问题讨论】:

  • ... | ft -hidetableheaders | gsutil ... -> ... | gsutil ...
  • 请勿使用Format-* cmdlet,除非您特别需要向用户显示格式化输出
  • 谢谢! gsutil 仍然没有上传我想要的所有内容,但至少脚本现在更干净了:)
  • 如果它仍然只复制第一个目录,则参数-I 可能无法正常工作。请改用... | ForEach-Object { gsutil -m cp -n -r $_ gs://... }
  • 谢谢!那工作得很好。很遗憾他们提出的论点没有按预期工作,但我们走了:)

标签: powershell google-cloud-platform


【解决方案1】:

我的"c:\temp" 文件夹有两个子文件夹。当我运行Get-ChildItem "c:\temp" | Where-Object {$_.psiscontainer} | Select-Object -ExpandProperty FullName | ft -hidetableheaders 时,Powershell 确实将c:\temp 中的两个子文件夹的名称输出到控制台:

C:\temp\child folder A
C:\temp\child folder B

然而,如果你捕获命令的输出并检查每个路径输出的数据类型,你会发现它们不是字符串,我认为gsutil 在使用 -I 时需要一个字符串作为输入(我认为Ansgar Wiechers's 注释是正确的)

运行这个:

$x = Get-ChildItem "c:\temp"| Where-Object {$_.psiscontainer} | Select-Object -ExpandProperty FullName | ft -hidetableheaders 
write-host $x.Count
$x[0] | get-member

在我的情况下,我看到预期的计数为 2(两个子文件夹)

但是,第一项的数据类型不是字符串,而是一个FormatEntryData:

$x[0] | get-member

在控制台上显示以下内容:

TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData

如果您删除命令的| ft -hidetableheaders 部分,则每个项目的数据类型都是字符串

运行这个:

$x = Get-ChildItem "c:\temp"| Where-Object {$_.psiscontainer} | Select-Object -ExpandProperty FullName 
write-host $x.Count
$x[0] | get-member

您将看到$x[0] 的数据类型为TypeName: System.String

这是否适用于gsutil

【讨论】:

  • 您好 Nova,感谢您的意见!我在原始帖子中可能没有正确解释自己,我不需要通过路径递归搜索 - 我只需要 gsutil 命令来上传该路径中的所有内容。如果我在路径中有 2 或 3 个文件夹,我希望所有这些文件夹都被上传。但目前它只上传找到的第一个文件夹。
  • @user3074653:我修改了我的答案。我认为你需要对你的每一条陈述进行故障排除
  • 感谢 Nova - 正如我之前所说,当我在没有 gsutil 命令的情况下运行这两个 Get-ChildItem 命令时,我返回了我希望看到的所有文件夹的列表 - 其中包括 LastWriteTime 条件。所以我认为问题出现在语句的末尾,特别是 gsutil 如何解释管道的内容。
  • @user3074653:好的,再来一次 - 查看新答案。我认为 AnsGar 有答案
【解决方案2】:

正如 Ansgar Wiechers 已经说过的,不要使用 Format-* cmdlet,除非您特别需要向用户显示格式化的输出。如果它仍然只复制第一个目录,则参数 -I 可能无法正常工作。请改用... | ForEach-Object { gsutil -m cp -n -r $_ gs://... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-11
    • 2021-10-10
    • 2020-09-24
    • 2021-06-18
    • 2015-01-30
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多