Skip to content

Files

Latest commit

03035da · Jan 9, 2022

History

History
440 lines (323 loc) · 16.2 KB

File metadata and controls

440 lines (323 loc) · 16.2 KB

六、结构化文件

操作 XML 文件

从文件导入 XML

要从先前构建的 xml 文件导入 XML 结构,如果您的 XML 文件是由导出-CliXml 命令创建的,则可以使用导入-Clixml 命令。PowerShell 中的 CLIXML 用于将对象及其表示对象存储到文件中。

要操作自己的 XML 结构,应该使用 Get-Content 命令,将对象转换为 XML。在这个例子中,因为我的 XML 文件是在 PowerShell 之外创建的,所以我将使用获取内容命令。

          $xmlFile = [xml](Get-Content -Path "C:\Users\rui.machado\Desktop\X.xml")

          #Creates a DOM Object available
          $xmlFile.PersonList | %{
                $_
          }

从字符串加载 XML 文件

PowerShell 允许您使用。NET 对象系统。Xml.XmlDocument 并调用 LoadXml($xmlString),构建一个 DOM 对象,并允许您在您的 Xml 树结构中进行迭代。现在尝试一下,构建一个脚本从一个字符串加载一个 XML 文件。下面的代码块显示了 XML 字符串:

          <PersonList>
                 <Person id='1'>
                        <Name>Rui</Name>
                        <Age>24</Age>
                        <Address>Street A</Address>
                 </Person>
                 <Person id='2'>
                        <Name>Peter</Name>
                        <Age>45</Age>
                        <Address>Street B</Address>
                 </Person>
                 <Person id='3'>
                        <Name>Mary</Name>
                        <Age>10</Age>
                        <Address>Street C</Address>
                 </Person>
          </PersonList>

使用您将要使用的 XML 文件,创建一个例程来处理需求。

          $xmlString = @"
                <PersonList>
                      <Person id='1'>
                            <Name>Rui</Name>
                            <Age>24</Age>
                            <Address>Street A</Address>
                      </Person>
                      <Person id='2'>
                            <Name>Peter</Name>
                            <Age>45</Age>
                            <Address>Street B</Address>
                      </Person>
                      <Person id='3'>
                            <Name>Mary</Name>
                            <Age>10</Age>
                            <Address>Street C</Address>
                      </Person>
                </PersonList>
          "@

          $xmlDoc = new-object System.Xml.XmlDocument

          $xmlDoc.LoadXml($xmlString)

          $xmlDoc.PersonList | %{
                 write $_.Person.Name
          }

将 XML 导出到文件

要将数据集导出到 XML 文件,您有两个选项。首先,可以使用 Export-CliXml 命令。然而,这是一种由 PowerShell 定义的非常专门的 XML 格式,它创建一个或多个对象的基于 XML 的表示,并将其存储在文件中。然后,您可以使用 Import-CLIXML 命令根据该文件的内容重新创建保存的对象。第二个选项是使用。NET 系统。对象,它允许您将其保存到文件系统。您也可以将输出传输到输出文件命令,该命令可以让您更好地控制文件的创建方式。第二种方法创建的 XML 文件更容易在 PowerShell 脚本之外使用。

          #The structure to export.
          $xml = @"
          <CarsList>
                <Car>
                      <Brand>Ferrari</Brand>
                </Car>
                <Car>
                      <Brand>Porsche</Brand>
                </Car>
          </CarsList>
          "@

          #Create a new XML document.
          $xmlDoc = New-Object System.Xml.XmlDocument

          #Load the xml structure.
          $xmlDoc.LoadXml($xml)

          #Define the file path.
          $pathToFile="c:\temp\FileXML.xml"

          #Save the structure to a file.
          $xmlDoc.Save($pathToFile)

在前面的示例中,我使用了。NET 对象系统。Xml.XmlDocument 将 Xml 文件加载并保存到文件系统;但是,您也可以使用 out file 命令,如下例所示。

          #The structure to export.
          $xml = @"
          <CarsList>
                <Car>
                      <Brand>Ferrari</Brand>
                </Car>
                <Car>
                      <Brand>Porsche</Brand>
                </Car>
          </CarsList>
          "@

          #Define the file path.
          $pathToFile="c:\temp\FileXML2.xml"

          #Export the file.
          $xml | Out-File $pathToFile

这两个先前的脚本将产生相同的 XML 文件。区别只是创建的代码数量和代码的干净程度,在第二种情况下,这要好得多。结果结构如下例所示。

          <CarsList>
                 <Car>
                        <Brand>Ferrari</Brand>
                 </Car>
                 <Car>
                        <Brand>Porsche</Brand>
                 </Car>
          </CarsList>

操作 CSV 文件

从文件导入 CSV

在 PowerShell 中导入 CSV 文件对于像技术迁移这样的项目可能很重要,在技术迁移中,其记录将被插入到 SQL Server 数据库中。在下面的代码块中,我们有一个 CSV 文件的小示例,在这种情况下,该文件将作为一个 PSObject 导入到 PowerShell,允许您按照自己的意愿迭代它。

          Rui;24;Portugal
          Tony;45;USA
          Thiago;12;Brazil
          Anna;56;Germany

要导入 CSV 文件,请使用 Import-CSV 命令,将 CSV 文件的路径、文件分隔符和标识结构化文件中每一列的标题作为参数。如果文件有标题,就不需要使用这个参数。

          #Path to CSV file.
          $path="c:\temp\ListaUsers.csv"

          #Import your CVS file defining the file path, CSV delimiter and the header.
          $csv=Import-CSV -Path $path -Delimiter ";" -Header "Name","Age","Nationality"

          #Storing the CSV to a variable allows you to manipulate its content.
          $csv | %{
                $_.Name
                $_.Age
                $_.Nationality
          }

将 CSV 导出到文件


| 伪对象封装类型为对象或类型为 PSCustomObject 的基本对象,以允许对 Windows PowerShell 环境中的任何对象进行一致的查看。 |


在 PowerShell 中导出到 Csv 比任何其他导出都要复杂一点,原因很简单:PowerShell 的 Export-Csv 命令适用于 PSObjects,因此在导出到 CSV 之前,您需要将您的结构转换为这种类型的结构。在下面的代码块中,我将向您展示如何从数组创建一个粒子对象,然后将其导出到 CSV。要导出,我将使用导出-Csv 命令,该命令将对象转换为一系列逗号分隔(Csv)字符串,并将这些字符串保存到文件中。

          #Path to export.
          $path = "c:\temp\testeExport.csv"

          #Structure to export.
          $csv=("Rui",24,"Portugal"),("Helder",29,"China"),("Vanessa",24,"Brasil")

          #Initialize the array that will be exported.
          $allRecords = @()

          $csv | %{  
                #Export-CSV separates columns from PSObject members, so we need to create one.
                $customCSV = New-Object PSObject

                #Add the name member to the PSObject
                $customCSV | Add-Member -MemberType NoteProperty -Value $_[0] -Name "Name"

                #Add the name member to the PSObject
                $customCSV | Add-Member -MemberType NoteProperty -Value $_[1] -Name "Age"

                #Add the name member to the PSObject
                $customCSV | Add-Member -MemberType NoteProperty -Value $_[2] -Name "Nationality"    

                #Add the PSObject to the array that stores every object to export.
                $allRecords+=$customCSV
          }

          #Export as CSV.
          $allRecords | Export-Csv -Path $path -NoTypeInformation -Delimiter ";"

加载 CSV 并发送电子邮件

          Rui,ruimachado@live.com.pt,Hello
          Machado,ruimachado@outlook.pt,Hi!

对于前面的公共分隔值文件,我们将使用它的值,并向定义的每个收件人发送电子邮件。

          <#
                Routine that matter CSV file. As the CSV file has columns use the
              Header-parameter to set the column headers. We also need to define the delimiter of the CSV,
                which in this case is a comma, but can be any other.
          #>

          $userList= Import-Csv -Path "C:\Users\rui.machado\Desktop\Users.csv"`
                                          -Header "Name", "Email", "Subject"`
                                          -Delimiter ","`

          #SMTP Server
          $smtpServer="smtp.gmail.com"

          #Create a new .NET SMTP client onject (587 is the default smtp port)
          $smtpClient = new-object Net.Mail.SmtpClient($smtpServer,587)

                #Create a new .NET Credential object.
                $credentials = New-Object Net.NetworkCredential

                #Set your credentials username.
                $credentials.UserName="powershellpt@gmail.com"

                #Set your credentials password.
                $credentials.Password="rpsrm@89"

          #Set the smtp client credential with the one created previously.
          $smtpClient.Credentials=$credentials

                #Create a new .NET mail message object.
                $email = new-object Net.Mail.MailMessage

                      #Initialize the from field.
                      $from="powershellpt@gmail.com"

                      #Initialize the mail message body.
                      $message="Este é um email do powershellpt. Seja bem vindo "

                #Set the from field in the mail message.
                $email.From = $from

                #Set the Reply to field in the mail message.
                $email.ReplyTo = $from

                #Set the body field in the mail message.
                $email.body = $message

          # foreach user in the CSV file, send the email.
          $userList | %{
                #Just send to users with a defined email.
                if($_.Email -ne $null)
                {          
                      #Set recipient name.
                      $nome=$_.Name

                      #Add recipient email to the Mail message object.
                      $email.To.Add($_.Email)

                      #Set the subject.
                      $email.subject = $_.Subject

                      #This is a Google smtp server requirement.
                      $smtpClient.EnableSsl=$true

                      #Send the email.
                      $smtpClient.Send($email)
                }
          }

操作文本文件

从文件导入 TXT

PowerShell 没有显式的导入命令。相反,您需要使用 Get-Content 命令来检索文本文件内容,这意味着您只需要将文件路径指定为参数。调用该命令后,PowerShell 将实例化一个系统。包含文本文件内容的字符串对象。

          #Path to the txt file.
          $path = "C:\temp\test.txt"

          #Get content from the txt file.
          $content = Get-Content -Path $path

          #Print content.
          $content

将 TXT 导出到文件

PowerShell 通过其 Out-File 命令将对象导出到文本文件,该命令将特定输出作为字符串发送到文件。此命令还允许您将要创建的文件的编码定义为参数。

          #Path to the txt file.
          $path = "C:\temp\newTest.txt"

          <#
                EXAMPLE 2
                Create txt file and write to it.
          #>

          "Write to Txt" | Out-File $path

          <#
                EXAMPLE 2
                Create txt file and write to it, setting the encoding to ACII.
          #>
          "Write to Txt" | Out-File $path -Encoding ASCII

          <#
                EXAMPLE 3
                Create txt file and write to it, setting the encoding to ACII and the width of 5,
                which means that only the first 5 characters will be exported.
          #>
          "Write to Txt" | Out-File $path -Encoding ASCII -Width 5

用 XSL 转换 XML 文件

有时,您可能需要转换 XML 文件,以便遵守预定义的 XML 模式,例如 SQL Server 数据库表。假设您希望查询客户端的 SQL Server 数据库,将数据集作为 XML 文档返回,使用 XSL 脚本对其进行转换,然后从另一个客户端将其插入到另一个 SQL 数据库表中。对于源和目标结构不相等的集成项目,这是一个非常强大的工具。在下面的代码块中,我将告诉您如何使用。NET System.XML.XSL.XSLCompiledTransform对象将 XSL 脚本应用于 XML 文件。

要输入一个 XML 文件,请使用下面的一个,它是一个人员列表。目标是将一个人的三个元素(姓名、年龄、地址)转换为逗号分隔的值元素(数据)。

          <PersonList>
                        <Person id='1'>
                               <Name>Rui</Name>
                               <Age>24</Age>
                               <Address>Street A</Address>
                        </Person>
                        <Person id='2'>
                               <Name>Peter</Name>
                               <Age>45</Age>
                               <Address>Street B</Address>
                        </Person>
                        <Person id='3'>
                               <Name>Mary</Name>
                               <Age>10</Age>
                               <Address>Street C</Address>
                        </Person>
          </PersonList>

您正在使用的 XSL 文件如下所示,它实现了前面定义的转换:

          <xsl:stylesheet version="1.0"
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                 <xsl:template match="/">
                        <PersonList>
                               <xsl:for-each select="PersonList/Person">
                                     <Person>
                                            <Data>
                                                   <xsl:value-of select="Name" />;
                                                   <xsl:value-of select="Age" />;
                                                   <xsl:value-of select="Address" />
                                            </Data>
                                     </Person>
                               </xsl:for-each>
                        </PersonList>
                 </xsl:template>
          </xsl:stylesheet>

要在 PowerShell 中用 XSL 文件实现转换,请使用我前面提到的System.XML.XSL.XSLCompiledTransform,特别是它的两个方法,Load()方法。

第一个方法将从路径加载 XSL 脚本,Transform()方法将转换脚本应用于输入 XML 文件,并将转换后的结构返回到输出 XML。这两个 XML 文件都由它们的路径定义为该方法的参数。

          #Path to XSL stylesheet
          $xslStylesheetPath = "C:\temp\XsltFile.xsl"

          #Path to XML Input file
          $xmlInputPath = "C:\temp\InputXml.xml"

          #Path to XML Ouput file. The result of the transformation.
          $xmlOutputPath = "C:\temp\OutputXml.xml"

          #Instantiate the XslCompiledTransform .NET object.
          $xslt = New-Object System.Xml.Xsl.XslCompiledTransform;

          #Load the XSL script.
          $xslt.Load($xslStylesheetPath);

          #Applies the transformation to the input XML and return the result as an ouput XML.
          $xslt.Transform($xmlInputPath, $xmlOutputPath);

结果,转换产生了下面的 XML 结构,人员元素被转换成一个逗号分隔的值元素。

          <?xml version="1.0" encoding="utf-8"?>
          <PersonList>
                 <Person>
                        <Data>Rui;24;Street A</Data>
                 </Person>
                 <Person>
                         <Data>Peter;45;Street B</Data>
                 </Person>
                 <Person>
                        <Data>Mary;10;Street C</Data>
                 </Person>
          </PersonList>