如何使用Powershell正确显示修改时间和修改字段
How to Display Modified Time and Modified By Fields Correctly with Powershell
我有一个脚本可以将所有列表和库中的所有 items/files 输出到 CSV。此外,它还显示 item/file 的当前和以前版本。这还会显示哪个用户修改了每个版本的文件,还显示 date/time 每个版本都修改了文件:
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 AM。但是当我转到 Lions.pdf 的版本历史时,它说版本 1 在 6:23 AM 被修改。时间差异与提前 5 小时相同,这是不正确的。
我似乎无法弄清楚我在这里做错了什么。有人可以协助解决我遇到的问题吗?我主要关心的是时间,非常感谢任何帮助。
用户字段
通常在服务器端代码中,使用数组表示法(例如 myItem["Author"]
)访问用户字段值会 return 您将转换为适当类型的对象(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);
我有一个脚本可以将所有列表和库中的所有 items/files 输出到 CSV。此外,它还显示 item/file 的当前和以前版本。这还会显示哪个用户修改了每个版本的文件,还显示 date/time 每个版本都修改了文件:
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 AM。但是当我转到 Lions.pdf 的版本历史时,它说版本 1 在 6:23 AM 被修改。时间差异与提前 5 小时相同,这是不正确的。
我似乎无法弄清楚我在这里做错了什么。有人可以协助解决我遇到的问题吗?我主要关心的是时间,非常感谢任何帮助。
用户字段
通常在服务器端代码中,使用数组表示法(例如 myItem["Author"]
)访问用户字段值会 return 您将转换为适当类型的对象(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);