4

私はsharepoint 07と組み合わせてpowershellを使用して、いくつかのものをリストしています。(パワー) ユーザーが表示するフィールドを指定できるようにしようとしています。
たとえば、次のようにコードを実行できます:
.\psextractor -fields "Type|name|User Desc
これを実行すると、上記のフィールドを表示するファイルのリストが取得されます。そうでない場合、create-object コマンドレットを使用せずにこれを行う方法はありますか?
私のコード:

#$Args
if($Args[0] -eq "-fields" -and $Args.Count -ge 2){
    $flds = $Args[1].split("|")
}

#Later in code
 $web.Lists | foreach{
    $lib = $_
    if($lib.BaseType -eq [Microsoft.SharePoint.SPBaseType]::DocumentLibrary 
           -and $lib.BaseTemplate -eq [Microsoft.SharePoint.SPListTemplateType]::DocumentLibrary){
        $lib.Items |  Select-Object DisplayName,
                  @{n=$flds[0];e={$_.Item($flds[0])}} ,
                  @{n=$flds[1];e={$_.Item($flds[1])}}
                  #, etc, etc

    }

 }

編集: 以下のGraimerのソリューションをいくつか微調整して使用しました

解決:

param([object[]]$flds)
$props=@() #globally declared since some of this is done in functions later

$mflds = $("Author","Created","Modified","Modified By") #mandatory fields
$mflds | foreach{
    if($flds -notcontains $_){
        $flds += $_
    }
}
#had to use regular for loop because the $_ identifier was conflicting
for ($i =0; $i -lt $flds.Count; $i++) { 
    $props += @{n=$flds[$i];e=([Scriptblock]::Create("`$_[`$flds[$i]]"))}
}
#other mandatory custom fields
    #the create method could have been used here
$props += @{n="FileName";e={"$($_.Item('Name'))"}}
$props += @{n="Url";e={"$wburl/$($_.Url)"}}

#Later in code
 $web.Lists | foreach{
    $lib = $_
    if($lib.BaseType -eq [Microsoft.SharePoint.SPBaseType]::DocumentLibrary 
           -and $lib.BaseTemplate -eq [Microsoft.SharePoint.SPListTemplateType]::DocumentLibrary){
        $lib.Items |  Select-Object -property $props

    }

 }
4

2 に答える 2

6

string[]パラメーターを通常の(配列) パラメーターとして取り込み、それを使用してハッシュテーブルの配列 (のカスタム式) を作成することをお勧めしますSelect-Object。次に、ハッシュテーブルに を指定しSelect-Objectます。元:

param (
    [String[]]$Fields
)

#Create property-array for Select-Object
$props = @()

#Add mandatory displayname property
$props += @{n="DisplayName";e=([Scriptblock]::Create("`$_.DisplayName"))}

#Add user-defined fields
foreach ($field in $Fields) { 
    $props += @{n=$field;e=([Scriptblock]::Create("`$_.Item($field)"))}
}

#Later in code
$web.Lists | foreach{
    $lib = $_
    if($lib.BaseType -eq [Microsoft.SharePoint.SPBaseType]::DocumentLibrary  `
    -and $lib.BaseTemplate -eq [Microsoft.SharePoint.SPListTemplateType]::DocumentLibrary)
    {
        $lib.Items | Select-Object -Property $props
    }

 }
#Usage: .\psextractor -Fields "Type", "Name", "User", "Desc"
#This will list all fields specified after '-Fields'
于 2013-02-06T15:19:37.307 に答える
1

次のように試すことができます:

param([object[]]$fields)

$fields += "DisplayName"

 $web.Lists | foreach{
    $lib = $_
    if($lib.BaseType -eq [Microsoft.SharePoint.SPBaseType]::DocumentLibrary 
           -and $lib.BaseTemplate -eq [Microsoft.SharePoint.SPListTemplateType]::DocumentLibrary){
        $lib.Items |  Select-Object -property $fields
    }

 }

次のように関数を呼び出します。

myfunction.ps1 -fields Type,name,User,Description
于 2013-02-06T15:17:45.437 に答える