从Sharepoint中的Lookup更改列表的列类型

时间:2009-06-11 18:09:22

标签: sharepoint powershell sharepoint-2007

我在Moss 2007标准环境中使用codeplex上的ilovesharepoint Lookup Field with Picker。我运行了安装项目,然后在Powershell中发出了相应的命令,将Lookup字段更改为带有Picker的Lookup(ConvertLookupToLookupFieldWithPicker.ps1),如下所示。

# http://www.iLoveSharePoint.com
# by Christian Glessner

param([string]$webUrl=$(throw 'Parameter -webUrl is missing!'), 
    [string]$listName=$(throw 'Parameter -listName is missing!'), 
    [string]$fieldTitle=$(throw 'Parameter -fieldTitle is missing!'))

$ErrorActionPreference = "Stop";

$env:12HivesDir = "$env:CommonProgramFiles\Microsoft Shared\web server extensions\12\";
$null = [System.Reflection.Assembly]::LoadFrom("$env:12HivesDir\ISAPI\Microsoft.SharePoint.dll");
$site =  New-Object -TypeName "Microsoft.SharePoint.SPSite" -ArgumentList $webUrl;
$web = $site.OpenWeb();
$list = $web.Lists[$listName];

$field = $list.Fields[$fieldTitle];
$schema = [xml]$field.SchemaXml;

$schema.Field.Type = "LookupFieldWithPicker"

if($schema.SelectSingleNode("//@SearchFields") -eq $null)
{
    $searchFields = $schema.CreateAttribute("SearchFields");
    $searchFields.PSBase.Value = [Microsoft.SharePoint.SPBuiltInFieldId]::ID.ToString();
    $schema.Field.PSBase.Attributes.Append($searchFields);
}

$field.SchemaXml = $schema.PSBase.OuterXml;

Write-Output "Done."

我一直看到这个错误

1d22ea11-1e32-424e-89ab-9fedbadb6ce1 异常设置“SchemaXml”:“不支持的字段类型更改。 该字段无法更改为新类型。请检查新类型,然后重试。“ 在C:\ Documents and Settings \ xgrmmart \ Desktop \ icgpm \ deploy \ ConvertLookupToLookupFieldWithPicker.ps1:29 char:8 + $ field.S<<<< chemaXml = $ schema.PSBase.OuterXml;

不知道为什么它不起作用.... 在测试环境中完美运行。我不是PowerShell的专家,非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:1)

好的我解决了这个问题。如果在运行批处理文件之前运行PowerShell脚本会出现问题(我以前没有意识到有人运行过它)。因此,您需要使用converse powershell脚本文件ConvertLookupFieldWithPickerToLookup.ps1并将其应用于列。完成后,重新应用上面的第一个文件,它应该都可以正常工作。

代码如下:

# http://www.iLoveSharePoint.com
# by Christian Glessner

param([string]$webUrl=$(throw 'Parameter -webUrl is missing!'), 
    [string]$listName=$(throw 'Parameter -listName is missing!'), 
    [string]$fieldTitle=$(throw 'Parameter -fieldTitle is missing!'))

$ErrorActionPreference = "Stop";

$env:12HivesDir = "$env:CommonProgramFiles\Microsoft Shared\web server extensions\12\";
$null = [System.Reflection.Assembly]::LoadFrom("$env:12HivesDir\ISAPI\Microsoft.SharePoint.dll");
$site =  New-Object -TypeName "Microsoft.SharePoint.SPSite" -ArgumentList $webUrl;
$web = $site.OpenWeb();
$list = $web.Lists[$listName];

$field = $list.Fields[$fieldTitle];
$schema = [xml]$field.SchemaXml;

if ($schema.Field.AllowMultipleValues -eq $true)
{
    $schema.Field.Type = "LookupMulti"
}
else
{
    $schema.Field.Type = "Lookup"
}

$schema.Field.RemoveAttribute("SearchFields");
$schema.Field.RemoveAttribute("EntityEditorRows");
$schema.Field.RemoveAttribute("MaxSearchResults");

$field.SchemaXml = $schema.PSBase.OuterXml;

Write-Output "Done."