Как правильно отображать измененное время и измененные поля с помощью Powershell
У меня есть скрипт, который выводит в CSV все элементы / файлы из всех списков и библиотек. Кроме того, он отображает текущую и предыдущие версии элемента / файла. Это также показывает, какой пользователь изменил файл для каждой версии, а также отображает дату / время, когда файл был изменен для каждой версии:
function Get-DocInventory([string]$siteUrl) {
$web = Get-SPWeb "http://contoso.com/sites/Depts3/HBG"
foreach ($list in $web.Lists) {
foreach ($item in $list.Items) {
foreach($version in $item.Versions){
$data = @{
"Version" = $version.VersionLabel
"List Name" = $list.Title
"Created By" = $item["Author"]
"Created Date" = ($item["Created"] -as [datetime]).DateTime
"Modified By" = $version["Editor"]
"Modified Date" = ($version["Modified"] -as [datetime]).DateTime
"Item Name" = $item.Name
}
New-Object PSObject -Property $data | Select "List Name", "Item Name", "Version", "Created By", "Created Date", "Modified By", "Modified Date"
}
}
$web.Dispose();
}
}
Get-DocInventory | Export-Csv -NoTypeInformation -Path C:\GenerateReport.csv
Ниже приведен пример того, что выводит скрипт:
И ниже приведен превосходный пример того, что я вижу, когда перехожу к истории версий файла Lions.pdf:
У меня 2 проблемы:
- В столбце Modified By отображаются электронная почта и имя пользователя домена, которые не требуются.
- Мой скрипт отображает столбец "Дата изменения" на 5 часов вперед. Выходные данные сценария для версии 1 файла Lions.pdf отображают время как 11:23. Но когда я захожу в историю версий Lions.pdf, там говорится, что версия 1 была изменена в 6:23. Расхождение во времени по всем направлениям равно 5 часам вперед, что неверно.
Я не могу понять, что я делаю здесь неправильно. Может ли кто-нибудь помочь в решении этой проблемы? Моя главная забота - время, и я был бы очень признателен за любую помощь.
1 ответ
Поля пользователя
Обычно в коде на стороне сервера, доступ к значению пользовательского поля с использованием нотации массива (например, myItem["Author"]
) вернет объект, который вы приведете к соответствующему типу (Microsoft.SharePoint.SPFieldUserValue
). Однако Powershell автоматически преобразует эти значения в строки, поэтому вы получаете нежелательные значения.
К счастью, есть способ обойти это! Сначала получите само поле как объект, затем передайте значение поля в поле GetFieldValue()
метод.
$userField = $item.Fields.GetField("Author");
$authorObject = $userField.GetFieldValue($item["Author"]);
Затем у вас будет объект со свойствами, к которым вы можете получить доступ для получения желаемых значений, таких как LookupValue
для отображаемого имени пользователя на сайте.
$authorName = $authorObject.LookupValue;
Поля даты
Поля даты немного проще, потому что Powershell фактически передаст их вам как объекты DateTime.
Чтобы отформатировать объект DateTime, вы можете просто вызвать .ToString()
и передать параметр, указывающий желаемый формат.
$data = @{
...
"Modified Date" = $item["Modified"].ToString("MM/dd/yyyy h:mm tt");
...
}
Расхождение во времени
Скорее всего, это связано с вашим местным часовым поясом. Время, отображаемое на сайте SharePoint через браузер, определяется настройками часового пояса вашего компьютера. Время, фактически сохраненное в базовой базе данных SharePoint, определяется настройками часового пояса сервера.
Чтобы согласовать их, вы можете использовать объект DateTime .ToUniversalTime()
метод для получения соответствующего объекта DateTime по времени UTC (и, при желании, смещения его по желанию, пока он не выровняется с настройками местного часового пояса и перехода на летнее время).
Изменить: Я предполагаю, что вы находитесь в восточном времени США (UTC-5), и это дает вам результаты в UTC времени (Всемирное координированное время, которое на 5 часов впереди вас, кроме в летнее время). Вы должны быть в состоянии сместить часы вручную, чтобы учесть это.
$localOffset = -5;
$modified = $version["Modified"] -as [datetime];
if($modified.IsDaylightSavingTime()){$localOffset += 1;}
$modifiedLocal = $modified.addHours(-$localOffset);