要从先前构建的 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 | %{
$_
}
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 文件,您有两个选项。首先,可以使用 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>
在 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
}
| 伪对象封装类型为对象或类型为 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 ";"
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)
}
}
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
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
有时,您可能需要转换 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>