1

すべてのリストとライブラリからすべてのアイテム/ファイルを 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 の例です。

ここに画像の説明を入力

私には2つの問題があります:

  • [変更者] 列には、必須ではない電子メールとドメイン ユーザー名が表示されます。
  • 私のスクリプトは、Modified Date 列を 5 時間先として表示します。バージョン 1 の Lions.pdf のスクリプト出力では、時刻が午前 11 時 23 分と表示されます。しかし、Lions.pdf のバージョン履歴を見ると、バージョン 1 は午前 6 時 23 分に変更されたと表示されます。時間の不一致は全面的に 5 時間先と同じですが、これは正しくありません。

ここで何が間違っているのか理解できないようです。誰かが私が抱えている問題を手伝ってもらえますか? 私の主な関心事は時間です。

4

1 に答える 1

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()メソッドを使用して、対応する DateTime オブジェクトを UTC 時間で取得します (必要に応じて、ローカル タイムゾーンと夏時間の調整に合わせてオフセットします)。

編集:米国東部時間 (UTC-5) を使用していると思いますが、結果は UTC 時間 (協定世界時、夏時間以外は 5 時間進んでいます) で表示されます。これを考慮して、時間を手動でオフセットできるはずです。

$localOffset = -5;
$modified = $version["Modified"] -as [datetime];
if($modified.IsDaylightSavingTime()){$localOffset += 1;}
$modifiedLocal = $modified.addHours(-$localOffset);
于 2015-11-04T16:55:41.903 に答える