Gsutil - cp не обрабатывает каждый элемент в конвейере

user3074653 спросил: 28 апреля 2018 в 09:16 в: powershell

Я пытаюсь создать небольшой скрипт 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

Но это только загружает содержимое первой папки в списке. Я попытался использовать объект foreach в команде gsutil, но я получил ошибку из-за того, что не нашел URL для загрузки. Когда вы записываете вывод foreach на консоль, вывод выглядит полностью пустым.

Я подтвердил, что вся строка минус команда gsutil возвращает правильные папки из пути, поэтому я знаю, что данные идут в трубопровод. Но я не уверен, почему gsutil рассматривает только первый пункт в конвейере.

Любая помощь будет принята с благодарностью и заблаговременно благодарим вас за это.

1 ответ

Nova Sys Eng ответил: 28 апреля 2018 в 04:00

В моей папке "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

Вы увидите тип данных TypeName: System.String для $x[0]

Это работает с gsutil?

user3074653 ответил: 28 апреля 2018 в 11:01
Привет, Нова, спасибо за вклад! Возможно, я не правильно объяснил себя в своем оригинальном посте, мне не нужно искать рекурсивно, хотя путь - мне просто нужна команда gsutil для загрузки всего в этот путь. Если у меня есть 2 или 3 папки в пути, я ожидаю, что все эти папки будут загружены. Но на данный момент он загружает только первую найденную папку.
Nova Sys Eng ответил: 28 апреля 2018 в 11:33
@ user3074653: Я изменил свой ответ. Я думаю, вам нужно не стрелять в каждую часть своих заявлений
user3074653 ответил: 28 апреля 2018 в 12:25
Спасибо Nova - как я уже говорил, когда я запускаю эти две команды Get-ChildItem без команды gsutil, я возвращаю список всех папок, которые я ожидаю увидеть, и это включает условие LastWriteTime. Поэтому я думаю, что проблема заключается в конце заявления, в частности, о том, как gsutil интерпретирует содержимое канала.
Nova Sys Eng ответил: 28 апреля 2018 в 01:16
@ user3074653: извините, вы правы - я пропустил это. Все еще смотрящий ....
Nova Sys Eng ответил: 28 апреля 2018 в 01:43
@ user3074653: ОК, еще раз - см. новый ответ. Я думаю, что у AnsGar был ответ