Get-AzureStorageFile не устанавливает свойство LastModified.

При попытке получить файлы из общего файлового каталога Azure я использую код PowerShell, как показано ниже (аналогично примеру из документы)

$file = Get-AzureStorageFile -Share $fileShare -Path "tolearn\doc" | Get-AzureStorageFile | Where-Object {$_.GetType().Name -eq "CloudFile"} 

Например, предположим, что у нас есть одна дочерняя папка и два файла в папке «doc». Приведенный выше код вернет эти два файла, как и ожидалось.

Однако свойство LastModified остается нулевым, как показано на картинке (а также другие свойства).

введите описание изображения здесь

Мне нужно свойство LastModified, чтобы отфильтровать файлы старше определенной даты и удалить их. Но, поскольку это значение равно нулю, это невозможно. Любая идея о том, как это сделать, очень ценится. Код для этого должен выглядеть так:

$file = Get-AzureStorageFile -Share $fileShare -Path "tolearn\doc" | Get-AzureStorageFile | Where-Object { $_.GetType().Name -eq "CloudFile" -and $currentTime -gt $_.Properties.LastModified.AddMinutes($offset)} 

Обратите внимание, если я запрашиваю один такой файл, например

$file = Get-AzureStorageFile -Share $fileShare -Path "tolearn\doc\Word2003.doc"

LastModified будет правильно установлено. Таким образом, похоже, что этот конвейерный вызов метода Get-AzureStorageFile не устанавливает эти свойства для возвращаемых файлов или каталогов.

Мой подход здесь плох, есть ли лучший способ отфильтровать файлы, чтобы удалить их из общего файлового ресурса Azure?


person Nesaje    schedule 21.11.2017    source источник


Ответы (2)


Таким образом, похоже, что этот конвейерный вызов метода Get-AzureStorageFile не устанавливает эти свойства для возвращаемых файлов или каталогов.

Я получаю тот же результат, что и вы, не могу получить LastModified vaule.

В качестве обходного пути мы можем использовать foreach, чтобы получить Properties.LastModified каждого файла, например:

PS C:\Users\jason> $file = Get-AzureStorageFile -Share $share -Path "jason"
PS C:\Users\jason> $c = $file | Get-AzureStorageFile
PS C:\Users\jason> $list = $c.name
PS C:\Users\jason> $list
04.PNG
08.PNG
test3
test4
PS C:\Users\jason> foreach($a in $list){$path = 'jason/'+$a ; $b = Get-AzureStorageFile -ShareName jasonshare1 -Path $path -Context $ctx; $b.Properties.LastModified }


DateTime      : 11/22/2017 2:31:13 AM
UtcDateTime   : 11/22/2017 2:31:13 AM
LocalDateTime : 11/22/2017 10:31:13 AM
Date          : 11/22/2017 12:00:00 AM
Day           : 22
DayOfWeek     : Wednesday
DayOfYear     : 326
Hour          : 2
Millisecond   : 0
Minute        : 31
Month         : 11
Offset        : 00:00:00
Second        : 13
Ticks         : 636469146730000000
UtcTicks      : 636469146730000000
TimeOfDay     : 02:31:13
Year          : 2017

DateTime      : 11/22/2017 2:31:14 AM
person Jason Ye    schedule 22.11.2017
comment
Спасибо @Jason Ye - MSFT за то, что изучили это и предоставили подробный пример кода. Теперь, когда я точно знаю, что у вас такое же поведение, вам поможет обходной путь. - person Nesaje; 22.11.2017

Чтобы установить свойства файла, вам необходимо вызвать:

$file.FetchAttributes()

Вот небольшой пример:

$files = Get-AzureStorageFile -ShareName $shareName -Context $ctx | where {$_.GetType().Name -eq "CloudFile"}
foreach($file in $files) {
    $file.FetchAttributes();
    if ($file.Properties.LastModified -ge $fromDate) {
        # Download file
        Get-AzureStorageFileContent -File $file -Destination $downloadDir
    }
}

На основе информации, представленной в: Свойства Azure CloubdBlob.Length возвращает 0

person Charlene Edwardson    schedule 28.03.2018
comment
Спасибо, что изучили это и дали ответ. Я сделал что-то подобное (включает цикл foreach). Но вопрос был связан с подключением этих двух команд (как в примере на сайте документации), и в этом случае некоторые атрибуты не были заполнены. В итоге, дело доходит до цикла foreach и либо получения файла за файлом, который заполнит все атрибуты, либо использования вашего подхода и сбора всех файлов, а затем атрибутов в соответствии с файлом. Дело в том, что его нельзя отфильтровать по дате в вызове команды по конвейеру, поэтому требуется дополнительная работа и foreach. - person Nesaje; 30.03.2018