【问题标题】:Open xml from Sharepoint document library in powershell在 Powershell 中从 Sharepoint 文档库中打开 xml
【发布时间】:2018-05-04 09:59:35
【问题描述】:

我正在尝试使用 powershell 从 sharepoint 文档库中操作 xml 文件。不幸的是,我无法打开它并将其转换为 xml。 :( 我在文档库和本地硬盘驱动器上有相同的文件。当我从硬盘驱动器打开它时,一切都很好。当我从 Sharepoint 文档库打开它时,由于开头有一个额外字符,转换为 xml 失败文件。我二进制比较了 $splistitem.File.OpenBinary() 和 get-content C:..\file.xml 的结果,它是一样的。问题是从字节中获取字符串。我尝试了所有可用的编码,但没有任何效果。这是我的代码:

   # Add SharePoint snapin if needed
    if ((Get-PSSnapin -Name Microsoft.SharePoint.Powershell -ErrorAction SilentlyContinue)     -eq $null)
    {
        Add-PSSnapin Microsoft.SharePoint.Powershell
    }

...
    $splistitem = ...
...

    $encode = New-Object System.Text.UTF8Encoding

    [xml]$xmlFromSharepoint = $encode.GetString($splistitem.File.OpenBinary()) #throws exception
    [xml]$xmlFromFile = get-content C:\....\file.xml #works fine

    $web.Dispose()

    Write-Host "Press any key to close ..."
    $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

抛出的异常带有消息:

        Cannot convert value "?<?xml version="1.0" encoding="utf-8"?> 
..." to type "System.Xml.XmlDocument". Error: "Data at the
    root level is invalid. Line 1, position 1."
    At C:\aaa.ps1:14 char:24
    + [xml]$xmlFromSharepoint <<<<  = $encode.GetString($splistitem.File.OpenBinary
    ())
        + CategoryInfo          : MetadataError: (:) [], ArgumentTransformationMet
       adataException
        + FullyQualifiedErrorId : RuntimeException

【问题讨论】:

    标签: sharepoint powershell


    【解决方案1】:

    我在回答自己。 :)

    file 前面的字符是 UTF8 编码的字节顺序标记。我发现我可以直接从共享点流加载 xml 文件。这解决了这个问题。我的目标是在共享点库中更改 Reporting Services 数据源的连接字符串。 .rsds 文件是保存连接字符串的普通 xml 文件。这是修改它的代码:

    # Add SharePoint snapin if needed
    if ((Get-PSSnapin -Name Microsoft.SharePoint.Powershell -ErrorAction SilentlyContinue)     -eq $null)
    {
        Add-PSSnapin Microsoft.SharePoint.Powershell
    }
    
    #Configure Connection strings
    $web = Get-SPWeb "http://localhost/c1"
    $reportsList = $web.Lists | Where-Object { $_.Title -eq "Reports" }
    $dataSource = $reportsList.Items | Where-Object { $_.Name -eq "Datasource.rsds" }
    $dataSource.File.CheckOut();
    $xml = New-Object System.Xml.XmlDocument
    $stream = $dataSource.File.OpenBinaryStream();
    $xml.Load($stream)
    $xml.DataSourceDefinition.ConnectString = "test"
    $stream.Position = 0;
    $stream.SetLength(0);
    $xml.Save($stream);
    $dataSource.File.SaveBinary($stream)
    $dataSource.File.CheckIn("");
    $web.Dispose()
    
    Write-Host "Press any key to continue ..."
    $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
    

    实际上我意识到上面的代码不起作用。要修改报告,我必须使用 ReportServer Web 服务。现在是工作代码:

    function ConfigureConnectionString
    {
    param($webUrl, $connectionString)
        $reportServerURI = "http://$serverUrl/ReportServer"
        $ReportPathWildCard = "/";
        $NameSharedSchedule="NeverExpireCache";
    
        $reportServerURI2010 = "$reportServerURI/ReportService2010.asmx?WSDL"
        $RS = New-WebServiceProxy -Class 'RS' -NameSpace 'RS' -Uri $reportServerURI2010 -UseDefaultCredential
        $dataSources = $RS.ListChildren($ReportPathWildCard,$true) | Where-Object {$_.TypeName -eq "DataSource" -and $_.Path -like "*$webUrl*"}
        foreach($ds in $dataSources) {
            $dsDefinition = $RS.GetDataSourceContents($ds.Path)
    
            $dsDefinition.CredentialRetrieval = "Store"
            $dsDefinition.Enabled = "TRUE";
            $dsDefinition.UserName = "domain\user";
            $dsDefinition.Password = "Password";
            $dsDefinition.ConnectString = $connectionString;
    
            #Update the DataSource with this new content
            $RS.SetDataSourceContents($ds.Path, $dsDefinition);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多