如何使用Powershell正确显示修改时间和字段修改

时间:2015-11-03 17:00:50

标签: powershell datetime sharepoint-2010 version modified-date

我有一个脚本,可以将所有列表和库中的所有项目/文件输出到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

以下是脚本输出内容的示例:

enter image description here

以下是我在阅读Lions.pdf文件的版本历史时所看到的一个很好的例子:

enter image description here

我有两个问题:

  • “修改者”列显示的电子邮件和域用户名不是必需的。
  • 我的脚本会提前5小时显示修改日期列。 Lions.pdf版本1的脚本输出显示时间为上午11:23。但是当我去Lions版本历史.pdf它说版本1在上午6:23被修改。时间差异是相同的,因为提前5个小时是不正确的。

我似乎无法弄清楚我在这里做错了什么。有人可以协助解决我遇到的问题吗?我主要担心的是时间,我非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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网站上显示的时间由您的PC的时区设置决定。实际保存到SharePoint的底层数据库的时间由服务器的时区设置决定。

要协调它们,您可以使用DateTime对象的.ToUniversalTime()方法以UTC时间获取相应的DateTime对象(并根据需要选择性地偏移它,直到它与本地时区对齐,夏令时调整)。

编辑:我猜你在美国东部时间(UTC-5)并且它以UTC时间(全球协调时间,除了夏令时外,还有5个小时。您应该能够手动抵消小时数以解决此问题。

$localOffset = -5;
$modified = $version["Modified"] -as [datetime];
if($modified.IsDaylightSavingTime()){$localOffset += 1;}
$modifiedLocal = $modified.addHours(-$localOffset);