Powershell和Sharepoint-更新列表

时间:2018-10-19 21:34:21

标签: powershell sharepoint

我已经阅读了大量有关使用Get-SPWeb的文章,但是由于身份验证错误,我一直无法使这些功能正常工作。我已经构建了自己的小函数来执行所需的操作,但是我正在努力弄清更新功能在做什么。以下是我已经构建的功能,并且所有这些功能都可以正常工作:

If (!$cred) {$cred = get-credential -UserName "$ENV:Username@$ENV:UserDomain.com" -Message "Enter your office 365 login"}

function Get-AuthenticationCookie($context)
{
    $sharePointUri = New-Object System.Uri($context.site.Url)
    $authCookie = $context.Credentials.GetAuthenticationCookie($sharePointUri)
    if ($? -eq $false) #https://ss64.com/ps/syntax-automatic-variables.html
    {
        return $null
    }
    $fedAuthString = $authCookie.TrimStart("SPOIDCRL=".ToCharArray())
    $cookieContainer = New-Object System.Net.CookieContainer
    $cookieContainer.Add($sharePointUri, (New-Object System.Net.Cookie("SPOIDCRL", $fedAuthString)))
    return $cookieContainer
}

function Get-SharepointContext
{
    Param(
        [Parameter(Mandatory = $true)]
        $siteUrl,
        [Parameter(Mandatory = $false)]
        $cred)

    If (!$cred) {$cred = get-credential -UserName "$ENV:Username@$env:USERDNSDOMAIN" -Message "Login"}

    [string]$username = $cred.UserName
    $securePassword = $cred.Password

    [Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
    [Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.ClientContext")
    $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)
    $ctx.RequestTimeOut = 1000 * 60 * 10;
    $ctx.AuthenticationMode = [Microsoft.SharePoint.Client.ClientAuthenticationMode]::Default
    $credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $securePassword)
    $ctx.Credentials = $credentials
    Return $ctx
}

function Add-SharepointListEntry
{
    #example
    #Add-SharepointListEntry -cred $cred -clientName $DestinationPages

    Param(
        [Parameter(Mandatory = $true)]
        $cred,
        [Parameter(Mandatory = $true)]
        $sitename,
        $siteUrl = "https://$env:Userdomain.sharepoint.com/$sitename",
        [Parameter(Mandatory = $true)]
        $ListName,
        $SharepointData
    )
    [Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")

    # Bind to site collection
    $Context = Get-SharepointContext -siteUrl $siteUrl -cred $cred

    # Get List
    $List = $Context.Web.Lists.GetByTitle($ListName)
    $Context.Load($List)
    $Context.ExecuteQuery()

    # Create Single List Item
    $ListItemCreationInformation = New-Object Microsoft.SharePoint.Client.ListItemCreationInformation
    $NewListItem = $List.AddItem($ListItemCreationInformation)

    #construct the entry to insert
    $NewListItem["Title"] = $SharepointData.Title #Client Name
    $NewListItem["Description"] = $SharepointData.Title

    #These objects should pass right through
    $NewListItem["Client"] = $SharepointData.Client
    $NewListItem["Author"] = $SharepointData.Author
    $NewListItem["Initials"] = $SharepointData.Author
    $NewListItem["Created"] = $SharepointData.Created

    $NewListItem.Update()
    $Context.ExecuteQuery()
}

Function Get-SharepointListData
{
    #example
    #Get-SharepointListData -cred $cred
    Param(
        [Parameter(Mandatory = $true)]
        $cred,
        [Parameter(Mandatory = $true)]
        $sitename,
        $siteUrl = "https://$env:Userdomain.sharepoint.com/$sitename",
        [Parameter(Mandatory = $true)]
        $ListName
    )

    [Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")
    # Bind to site collection
    $Context = Get-SharepointContext -siteUrl $siteUrl -cred $cred

    #Retrive the List
    $List = $Context.web.Lists.GetByTitle($ListName)

    #Get All List Items
    #reference https://gallery.technet.microsoft.com/office/How-to-do-a-CAML-Query-6f5260cf
    $Query = New-Object Microsoft.SharePoint.Client.CamlQuery
    $ListItems = $List.GetItems($Query)
    $context.Load($ListItems)
    $context.ExecuteQuery()

    # Turn item into a catch array
    $ListItemCollection = @()

    ForEach ($item in $ListItems)
    {
        $propertiesValues = New-Object PSObject
        $currentItem = $item
        $item.FieldValues.Keys | Where {$_ -ne "MetaInfo"} | ForEach {Add-Member -InputObject $propertiesValues -MemberType NoteProperty -Name $_ -Value $currentItem[$_]}
        $ListItemCollection += $propertiesValues
        Remove-Variable propertiesValues
    }
    Return $ListItemCollection
}

现在,我正在构建一个新功能,并尝试使用一个列表(正在查询共享点文件夹)来更新共享点列表。我使用get-sharepointlistdata查询目录,如果缺少某些内容,则循环遍历结果以添加新条目。这整个过程没有问题。我试图添加任何更新的步骤,但是该函数在$ list.Items.GetByID($ index)上始终失败,并抛出错误“您不能在空值表达式上调用方法。” / p>

    Function Set-SharepointListData
{
    Param(
        [Parameter(Mandatory = $true)]
        $cred,
        [Parameter(Mandatory = $true)]
        $sitename,
        $siteUrl = "https://$env:userdomain.sharepoint.com/$sitename",
        [Parameter(Mandatory = $true)]
        $ListName,
        [Parameter(Mandatory = $true)]
        [int]$Index,
        [Parameter(Mandatory = $true)]
        $Time
    )
    [Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client")

    # Bind to site collection
    $Context = Get-SharepointContext -siteUrl $siteUrl -cred $cred

    # Get List
    $List = $Context.Web.Lists.GetByTitle($ListName)
    $Context.Load($List)
    $Context.ExecuteQuery()

    # Select Single List Item
    $ListItem = $List.Items.GetById($index)

    $ListItem["Created"] = $time
    $ListItem.Update();
    $Context.ExecuteQuery(); 
}

我确定我在这里忽略了一些明显的事情……任何人有任何想法吗?

1 个答案:

答案 0 :(得分:1)

$ Context.Web.Lists.GetByTitle($ ListName)不返回列表的项目。您必须加载项目...通常通过caml查询完成。请参见here-尽管该示例在C#中,但它应该可以帮助您入门。

实际上,我建议您使用PnPPowershell,因为有很多cmdlet可以与Sharepoint一起使用。