2017-04-13 30 views
0

PowerShellでリストと選択列を作成できますが、選択列は常に失敗します。私は何かが欠けているはずなので、私のコードが動作することを示すいくつかの例を見つけました。PowerShellを使用してSharePointの選択フィールドを作成する

MSDN Link to Add field

clear 
Add-PSSnapin Microsoft.SharePoint.PowerShell 

function CreateCustomList($siteCollectionUrl, $listName, $listTitle, $listDescription) { 
    $spWeb = Get-SPWeb -Identity $siteCollectionUrl 
    $spTemplate = $spWeb.ListTemplates["Custom List"] 
    $spListCollection = $spWeb.Lists 
    $spListCollection.Add($listName, $listDescription, $spTemplate) 
    $path = $spWeb.url.trim() 

    #set display name 
    $spList = $spWeb.GetList("$path/Lists/$listName") 
    $spList.Title = $listTitle 
    $spList.Update() 

    return $spList 
} 

function AddChoiceField($spList, $title){ 
    #create choices collection 
    $choices = New-Object System.Collections.Specialized.StringCollection 
    $choices.Add("Completed") | Out-Null 
    $choices.Add("Pending") | Out-Null 
    $choices.Add("Not Applicable") | Out-Null 

    #create choice field 
    $name = $title -replace '\s','' 
    $spFieldType = [Microsoft.SharePoint.SPFieldType]::Choice 
    $name = $spList.Fields.Add($name, 
     [Microsoft.SharePoint.SPFieldType]::Choice, 
     $false, 
     $false, 
     $choices); 

    #Set display Name 
    $spCol = $spList.Fields[$name] 
    $spCol.Title = $title 
    $spCol.Update() 
} 

$siteCollectionUrl = "http://URL" 
$listName = "CustomCheckList" 
$listTitle = "Custom Checklist" 
$listDescription = "This checklist is used because of reasons" 

$spList = CreateCustomList $siteCollectionUrl $listName $listTitle $listDescription 
AddChoiceField $spList, "First checklist item" 

編集: ここでエラーメッセージがあなたのコードが正しいようなので、間違って何か他のものが存在しなければならない

Cannot find an overload for "Add" and the argument count: "5". 
At line:11 char:5 
+  $name = $spList.Fields.Add($name, 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodException 
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest 

Exception setting "Title": "Object reference not set to an instance of an object." 
At line:19 char:5 
+  $spCol.Title = $title 
+  ~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], SetValueInvocationException 
    + FullyQualifiedErrorId : ExceptionWhenSetting 
+0

この多量のコードをwritttingではなく、fieldAsXmlを追加します。 – Vaibhav

+0

"私の山ほどのコードは機能しません:*スプラット*"は良い質問ではありません。どのように失敗する?それは何をしなければならないのですか?それはどのようなエラーですか?問題のコード行を分離する、または修正するために何をやってみましたか? – TessellatingHeckler

+0

私の悪い私は、エラーの詳細を追加することを忘れていた。 – Swazimodo

答えて

1

これは、PowerShellがパラメータと戻り値をどのように処理したかを理解していない場合です。

関数を呼び出してパラメータを渡すときに、パラメータ名を使用しない場合は、関数の最初のパラメータへの配列渡しを前提としています。これは、ThriggleがAddFieldAsXmlを使用する提案が存在せず、私にとって失敗した理由です。

戻り値の場合、関数のすべての出力は配列として返されます。戻り値から最後のパラメータを取得し、それを私が望むリストオブジェクトとして保存するために$ return [-1]を使用しました。

$return = CreateCustomList $siteCollectionUrl $listName $listTitle $listDescription 
$spList = $return[-1] 
AddChoiceField -spList $spList -title "SR Test List" 
1

が返されます。

XMLの文字列を使用してプレイしたい場合、AddFieldAsXml()は少し難しい傾向があります。

PowerShellは、1つのパラメータ(および文字列)しか持たないため、さまざまなオブジェクト/パラメータ型と潜在的または虚偽のメソッドオーバーロードと混同される可能性は低くなります。

function AddChoiceField($spList, $title){ 
    $name = $title -replace '\s','' 
    $xml = '<Field Required="FALSE" Description="" DisplayName="' + $name + 
     '" Type="Choice" Format="Dropdown" FillInChoice="FALSE">' + 
     '<CHOICES><CHOICE>Completed</CHOICE><CHOICE>Pending</CHOICE><CHOICE>Not Applicable</CHOICE></CHOICES>' + 
     '</Field>' 
    $spList.Fields.AddFieldAsXml($xml); 
    $spList.Update(); 
    $spCol = $spList.Fields[$name] 
    $spCol.Title = $title 
    $spCol.Update() 
} 
+0

これは潜在的に回避策になるでしょうが、私のコードに何が間違っていますか?私は、同じことをやっている他の人たちの例をいくつか見つけました。 http://www.dotnetsharepoint.com/2013/06/how-to-create-list-using-power-shell.html#.Upem3cROMnU – Swazimodo

+0

これをテストしただけで、失敗しました。「[Microsoft.SharePoint。 SPField]に 'AddFieldAsXml'というメソッドが含まれていません " – Swazimodo

+0

@SamNesbittこれは非常に興味深いです。 '$ spList.Fields'はSPFieldではなくSPFieldCollection型でなければなりません。たぶんあなたは '$ spList'パラメータの値を少し調べて、それがあなたが期待するものであることを確認する必要があります。 – Thriggle

関連する問題