【问题标题】:Powershell output content of two arrays based on a join基于连接的两个数组的Powershell输出内容
【发布时间】:2018-03-28 22:18:01
【问题描述】:

我正在查询 sql 以从 SharePoint Nintex 数据库中收集一些 nintex 信息。 Nintex 仅持有 SharePoint siteid。所以我需要powershell从sql输出的结果中获取url(和一些额外的数据) 我可以使用:

$GUIDS = ($DS.Tables[0] | select -ExpandProperty  siteid) | Format-Table -HideTableHeaders | Out-String
foreach($line in $guids)
{Get-Spsite -identity $line  | Select -property ID, URL, OWner, Hostname | Export-Csv -Path c:\temp\url.csv -NoTypeInformation }

但我还需要 csv 输出来包含数组 $workflowdetails 中的工作流启动器、工作流名称和活动名称。

如何将输出合二为一并导出到 csv 这是我目前所拥有的:

[CmdletBinding()]

param
(
[Parameter(Mandatory=$True)]
 [string]$SQLServerInstance,
[Parameter(Mandatory=$True)]
[string]$NintexConfigDBName
)
Add-PSSnapin Microsoft.SharePoint.PowerShell
$ConnectionTimeout = 30
$Query =  "SELECT DISTINCT i.workflowname,i.siteid,i.workflowinitiator, a.activityname FROM dbo.workflowinstance 
i inner join WorkflowProgress P on I.InstanceID=P.InstanceID inner join Activities A on P.ActivityID=A.ActivityID WHERE a.activityname IN ('Call web service','Execute SQL','Query LDAP','Query XML', 'Start workflow in Nintex Workflow Cloud ',  'Update XML  ', 'Web request ', 'Capture document set version  ', 'Copy to file share',  'Create list', 'Declare as record ', 'Delete drafts', 'Delete item ', 'Delete multiple items', 'Delete previous versions', 'Discard check out ','Query list','Send document set to repository',  'Send document to repository','Set approval status ','Set item permissions', 'Undeclare as record  ', 'Update multiple items', 'Action set', 'Commit pending changes', 'Run parallel actions', 'State machine ', 'Pause for...  ', 'Pause until...  ', 'Wait for check out status change ', 'Wait for item update ', 'Create site  ','Create site collection','Decommission site collection ',  'Delete site', 'Publish Workflow', 'Assign Flexi task', 'Complete workflow task ' ) "

$QueryTimeout = 120

$conn=new-object System.Data.SqlClient.SQLConnection
$ConnectionString = "Server={0};database={1};Integrated Security=True;Connect Timeout={2}" -f $SQLServerInstance,$NintexConfigDBName,$ConnectionTimeout
$conn.ConnectionString=$ConnectionString
$conn.Open()
$cmd=new-object system.Data.SqlClient.SqlCommand($Query,$conn)
$cmd.CommandTimeout=$QueryTimeout
$ds=New-Object system.Data.DataSet
$da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd)
$da.fill($ds)
$conn.Close()
$DS.Tables[0]  
$workflowdetails = ($DS.Tables[0] | select -ExpandProperty  siteid, workflowinitiator, workflowname,activityname ) | Format-Table -HideTableHeaders | Out-String
$GUIDS = ($DS.Tables[0] | select -ExpandProperty  siteid) | Format-Table -HideTableHeaders | Out-String
foreach($line in $guids)
{Get-Spsite -identity $line  | Select -property ID, URL, OWner, Hostname | Export-Csv -Path c:\temp\url.csv -NoTypeInformation }

【问题讨论】:

  • 您可以使用-append-Force 参数将$workflowdetails 附加到url.csv。像这样的东西——$workflowdetails | export-csv -Path c:\temp\url.csv -NoTypeInformation -Append -Force

标签: sql-server powershell csv


【解决方案1】:

如果您想将所有网站导出到同一个 CSV 文件,只需在循环之后使用Export-Csv

所以我们这样:

foreach ($line in $guids) {
    Get-Spsite -identity $line
} | Select ID, URL, OWner, Hostname | Export-Csv -Path c:\temp\url.csv -NoTypeInformation

而不是这个:

foreach ($line in $guids) {
    Get-Spsite -identity $line | Select -property ID, URL, OWner, Hostname | Export-Csv -Path c:\temp\url.csv -NoTypeInformation
}

如果您想将站点数据和 SQL 结果结合起来,您基本上必须创建某种方式来查找一个内容,同时输出另一个内容。

哈希表旨在通过键快速查找内容,因此将所有站点存储在哈希表中是有意义的:

$sitesById = @{}
foreach ($SiteID in $DS.Tables[0].SiteID) {
    $sitesById[$SiteID] = Get-Spsite -identity $SiteID
}

之后,您可以将 Select-Object 与计算列一起使用,将来自 SharePoint 网站的数据添加到 SQL 输出中。

$DS.Tables[0] |
    Select-Object siteid, workflowinitiator, workflowname, activityname,
        @{name="URL"; expression={ $sitesById[$_.siteid].URL }}
        @{name="Owner"; expression={ $sitesById[$_.siteid].Owner }},
        @{name="Hostname"; expression={ $sitesById[$_.siteid].Hostname }} |
    Export-Csv -Path c:\temp\url.csv -NoTypeInformation

【讨论】:

  • 非常感谢 Tonalak。我现在明白了.. 我做到了,它现在可以工作了
  • 如果这对您有帮助,请点赞。 Upvotes 是本网站的“谢谢,这对我有帮助”。
【解决方案2】:
[CmdletBinding()]

    param
    (
    [Parameter(Mandatory=$True)]
     [string]$SQLServerInstance,
    [Parameter(Mandatory=$True)]
    [string]$NintexConfigDBName
    )
    Add-PSSnapin Microsoft.SharePoint.PowerShell
    $ConnectionTimeout = 30
    $Query =  "SELECT DISTINCT i.workflowname,i.siteid,i.workflowinitiator, a.activityname FROM dbo.workflowinstance 
    i inner join WorkflowProgress P on I.InstanceID=P.InstanceID inner join Activities A on P.ActivityID=A.ActivityID WHERE a.activityname IN ('Call web service','Execute SQL','Query LDAP','Query XML', 'Start workflow in Nintex Workflow Cloud ',  'Update XML  ', 'Web request ', 'Capture document set version  ', 'Copy to file share',  'Create list', 'Declare as record ', 'Delete drafts', 'Delete item ', 'Delete multiple items', 'Delete previous versions', 'Discard check out ','Query list','Send document set to repository',  'Send document to repository','Set approval status ','Set item permissions', 'Undeclare as record  ', 'Update multiple items', 'Action set', 'Commit pending changes', 'Run parallel actions', 'State machine ', 'Pause for...  ', 'Pause until...  ', 'Wait for check out status change ', 'Wait for item update ', 'Create site  ','Create site collection','Decommission site collection ',  'Delete site', 'Publish Workflow', 'Assign Flexi task', 'Complete workflow task ' ) "

    $QueryTimeout = 120

    $conn=new-object System.Data.SqlClient.SQLConnection
    $ConnectionString = "Server={0};database={1};Integrated Security=True;Connect Timeout={2}" -f $SQLServerInstance,$NintexConfigDBName,$ConnectionTimeout
    $conn.ConnectionString=$ConnectionString
    $conn.Open()
    $cmd=new-object system.Data.SqlClient.SqlCommand($Query,$conn)
    $cmd.CommandTimeout=$QueryTimeout
    $ds=New-Object system.Data.DataSet
    $da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd)
    $da.fill($ds)
    $conn.Close()
    $DS.Tables[0]  

    foreach ($element in $DS.Tables[0])
    {

        $WFI = ($DS.Tables[0] | select -ExpandProperty   workflowinitiator)
        $WFN = ($DS.Tables[0] | select -ExpandProperty   workflowname )
        $WFA = ($DS.Tables[0] | select -ExpandProperty   activityname )
        $WFID = ($DS.Tables[0] | select -ExpandProperty   siteid )


            foreach($line in $WFID)

                    {
                    $siteURL= Get-Spsite -identity $line | Select -property  URL, OWner, Hostname 
                    }

                    $Properties = @{
                    WFInitiator = $WFI
                    WFname =$WFN
                    WFactivity = $WFA
                    SiteID = $WFID
                    siteURL = $siteURL.url
                    siteowner=$siteURL.owner
                    hostname =$siteURL.hostname
                    }
    $Results += New-Object psobject -Property $properties
    }
    $Results | Select-Object WFinitiator, WFname, WFactivity, siteid,siteurl, siteowner, hostname | export-Csv -notypeinformation -Path C:\temp\url.csv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多