【问题标题】:How to Display Modified Time and Modified By Fields Correctly with PowershellPowershell如何正确显示修改时间和字段修改
【发布时间】:2016-02-03 22:48:34
【问题描述】:

我有一个脚本,可以将所有列表和库中的所有项目/文件输出到 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 文件的版本历史时看到的 excel 示例:

我有两个问题:

  • 修改者列显示不需要的电子邮件和域用户名。
  • 我的脚本将修改日期列显示为提前 5 小时。 Lions.pdf 版本 1 的脚本输出显示时间为上午 11:23。但是当我转到 Lions.pdf 的版本历史时,它说版本 1 在上午 6:23 被修改。时间差异与提前 5 小时完全一致,这是不正确的。

我似乎无法弄清楚我在这里做错了什么。有人可以帮助解决我遇到的问题吗?我主要关心的是时间,如果能提供任何帮助,我将不胜感激。

【问题讨论】:

  • 您的本地时间偏移量是多少?
  • 我的机器显示 (UTC-07:00) Arizona。这是您需要的信息吗?
  • 您在本地系统或远程系统上运行此代码?
  • "Modified By" = $version["Editor"] 是返回字符串还是对象?如果是一个对象,只需拉出你想要的属性。如果是字符串,请使用正则表达式去除 ,# 之后的部分。时间戳可能不同,因为您查看日期的位置和运行脚本的位置之间的时区不同。其中一个系统有不同的时区。
  • 这是在本地机器上。

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


【解决方案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);

【讨论】:

  • 感谢您的帮助,我能够更清晰地返回用户名。现在唯一的差异是时间。我将如何或在哪里附加 .ToUniversalTime() 在脚本中解决修改日期列提前 5 小时返回时间的问题?你能帮我澄清一下吗?
  • 我已经用一些手动偏移时间的示例代码更新了我的答案。 ToUniversalTime() 函数对于将本地时间转换为 UTC 时间很有用,但在你的情况下,我认为你想做相反的事情。
猜你喜欢
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多