使用 PowerShell 创建 SharePoint 选择字段
Create SharePoint Choice Fields with PowerShell
我希望能够使用 PowerShell 创建列表和选择列,但选择列总是失败。我发现了一些显示我的代码可以工作的例子,所以我一定是遗漏了一些东西。
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
您的代码看起来是正确的,所以肯定是其他地方出了问题。
在 PowerShell 中,如果您愿意使用 XML 的字符串,AddFieldAsXml()
确实会更容易一些。
由于它只有一个参数(并且是一个字符串),因此 PowerShell 不太可能与各种 object/parameter 类型和潜在或虚构的方法重载混淆。
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()
}
这是一个不理解 PowerShell 如何处理参数和 return 值的案例。
在调用函数和传入参数时,如果你不使用参数名,它会假定你将一个数组传递给函数的第一个参数。这就是为什么 Thriggle 关于使用 AddFieldAsXml 的建议不存在并且对我来说失败的原因。
对于 return 值,函数的所有输出都作为数组传回。我使用 $return[-1] 从 return 值中获取最后一个参数并将其保存为我想要的列表对象。
$return = CreateCustomList $siteCollectionUrl $listName $listTitle $listDescription
$spList = $return[-1]
AddChoiceField -spList $spList -title "SR Test List"
我希望能够使用 PowerShell 创建列表和选择列,但选择列总是失败。我发现了一些显示我的代码可以工作的例子,所以我一定是遗漏了一些东西。
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
您的代码看起来是正确的,所以肯定是其他地方出了问题。
在 PowerShell 中,如果您愿意使用 XML 的字符串,AddFieldAsXml()
确实会更容易一些。
由于它只有一个参数(并且是一个字符串),因此 PowerShell 不太可能与各种 object/parameter 类型和潜在或虚构的方法重载混淆。
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()
}
这是一个不理解 PowerShell 如何处理参数和 return 值的案例。
在调用函数和传入参数时,如果你不使用参数名,它会假定你将一个数组传递给函数的第一个参数。这就是为什么 Thriggle 关于使用 AddFieldAsXml 的建议不存在并且对我来说失败的原因。
对于 return 值,函数的所有输出都作为数组传回。我使用 $return[-1] 从 return 值中获取最后一个参数并将其保存为我想要的列表对象。
$return = CreateCustomList $siteCollectionUrl $listName $listTitle $listDescription
$spList = $return[-1]
AddChoiceField -spList $spList -title "SR Test List"