Powershell & Lotus Notes - 将 While 循环的输出从文本更改为 XML 输出

Posted

技术标签:

【中文标题】Powershell & Lotus Notes - 将 While 循环的输出从文本更改为 XML 输出【英文标题】:Powershell & Lotus Notes - change output of While Loop from Text to XML Output 【发布时间】:2013-03-06 17:41:01 【问题描述】:

我正在针对 Lotus Notes 服务器上的视图运行 Powershell 脚本。它目前以如下方式产生输出:

UserID|Name|Internet Address
user1|John Smith|john.smith@mycompany.com
user2|Joe Smith|joe.smith@mycompany.com
user3|Bill Smith|bill.smith@mycompany.com

注意:标题行当前不是输出的一部分,仅用于提供信息。

当前输出到一个文本文件,但我现在需要将其更改为 XML。使用以下 Powershell 脚本提取数据。

$session = New-Object -ComObject lotus.notessession
$session.initialize()
$session.notesversion

if (Test-Path -Path "c:\myfile.txt") 
    Remove-Item -Path "c:\myfile.txt" 
    

$db = $session.GetDatabase("lotusServer","names.nsf")
$db.title

$view = $db.GetView('People')
Write-Host "View read : " $view.Name

# Show number of documents 
$nbrDocs = $view.AllEntries.Count 
Write-Host "Num of Docs : " $nbrDocs

# Get First Document in the View 
$doc = $view.GetFirstDocument()

#Read fields for current document 
$delim = "|" 
$i = 0 

    while ($doc -ne $null) 
        $internetAddress = [string] $doc.GetItemValue("InternetAddress") 
        $companyname = [string] $doc.GetItemValue("CompanyName") 
        $fullname = [string] $doc.GetItemValue("FullName")  
        if ( $companyname -eq "My Company") 
            $i = $i + 1
            # format the full name field
            $fullname = $fullname.Substring(3)
            $s = $fullname
            $c1 = $s.LastIndexOf(" ")
            $c2 = $s.IndexOf("/")
            $name = $s.Substring(0,$c2)
            $userID = $s.Substring($c1+1)

            $zOut = $userID + $delim + $name + $delim +  $internetAddress 
            Write-Host $zOut
            Write-Output $zOut| out-file "c:\myfile.txt" -append -width 2000
             #end if
        $doc = $view.GetNextDocument($doc) 
      #end while

我希望现在的输出采用类似于以下的 XML 格式:

<?xml version="1.0" ?> 
<Company>
   <UserID>user1
      <Name>John Smith</Name> 
      <InternetAddress>john.smith@mycompany.com</InternetAddress> 
   </UserID> 
</Company>

数据不应有任何重复,并且(在某些时候)输出中可能有多家公司,但总体结构与上述示例不会有太大差异(名称和 InternetAddress 是 UserID 的子项)。

但是,我现在解析数据的方式(而 $doc -ne $null)我一次只能看到一行。我发现的示例展示了如何导出/写入 XML 一次执行,而不是一次执行一行。输出 XML 将在用于其他地方之前进行验证。我可以将此脚本的输出写入 XML 文件吗?如果可以,怎么写?

任何想法/建议表示赞赏。

谢谢!

【问题讨论】:

【参考方案1】:

以下行处理记录输出。

$zOut = $userID + $delim + $name + $delim +  $internetAddress 

您需要对其进行修改,以便可以编写为 XML。

例子:

$zOut = "<UserID>" + $userID + "</UserID>" ..... (etc)

您一次只能看到一行,因为您正在遍历视图中的一组记录。

如果您想一次性获取所有数据,可以在视图 URL 查找中使用 ?ReadViewEntries&outputformat=XML 设置。这样做是有限制的。更多细节在这里:

http://publib.boulder.ibm.com/infocenter/domhelp/v8r0/topic/com.ibm.designer.domino.main.doc/H_ABOUT_URL_COMMANDS_FOR_OPENING_SERVERS_DATABASES_AND_VIEWS.html

或者,您可以在 XPage 中制作它,或者导出到 DXL 并通过 XSLT 进行转换。

但是这些替代方案将比您现在拥有的更有效。

【讨论】:

谢谢 - 两者都非常有帮助。我曾尝试使用 ReadViewEntries,但没有可用的视图只包含这些字段。

以上是关于Powershell & Lotus Notes - 将 While 循环的输出从文本更改为 XML 输出的主要内容,如果未能解决你的问题,请参考以下文章

使用 Powershell 查找 Lotus Notes 互联网电子邮件地址

FileCoin Lotus复制证明 PoRep 源码梳理

Lotus domino FTSearch 查询

[No0000105]java sdk 开发环境变量powershell 自动配置脚本

powershell提示no such file ordictionary

lotus notes8.5软件出现问题!!!