Bit*_*iac 6 xml powershell parsing
在针对从任务计划程序导出的XML文件运行时,使用此PowerShell查询以正确格式获取所需结果时遇到问题.我最终会将所有Task Scheduler导出的作业转移到同一个XML文件中,但我现在只从一个开始.
PowerShell Logic (不工作)
$file = "C:\folder\test.xml"
$Xml  = [xml](Get-Content $file)
$Xml.SelectNodes("//*").ChildNodes | Select URI,Command | 
Where-Object { ($_.URI -ne $null) -or ($_.Command -ne $null) } | FL 
也许有更好或更明确的方式在循环中使用PowerShell执行此操作或嵌入一些C#代码并使用PowerShell等执行它.我想我会在这里问其他人,因为经过大量测试后我无法理解这一点研究,但我愿意接受所有想法,以帮助我获得所需的结果或类似的东西(见下文).如果我需要SQL Server的结果我会使用FOR XML PATH.
当前结果格式 (不需要)
URI     : \_Test\Test
Command : 
URI     : 
Command : C:\Folder\process1.exe
URI     : 
Command : C:\Folder\process2.exe
期望的结果格式 (或类似)
URI     : \_Test\Test
Command : C:\Folder\process1.exe
Command : C:\Folder\process2.exe
示例XML
   <?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2017-03-09T09:36:56.2658334</Date>
    <Author>FBI-PC1\User</Author>
    <URI>\_Test\Test</URI>
  </RegistrationInfo>
  <Triggers />
  <Principals>
    <Principal id="Author">
      <UserId>S-1-5-21-3517161704-4063526634-2635523359-1001</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>C:\Folder\process1.exe</Command>
    </Exec>
    <Exec>
      <Command>C:\Folder\process2.exe</Command>
    </Exec>
  </Actions>
</Task>
系统规格 (需要使用)
由于您要应用 where 条件一起选择两个对象,因此为了保持作为单个对象的相等性,它显示如下。
在你的情况下,你可以做的是将结果存储在arraylist中,并在那里对你得到的所有命令进行操作:
$file = "C:\folder\test.xml"
$Xml  = [xml](Get-Content $file)
$URI= $Xml.SelectNodes("//*").ChildNodes | Select URI| Where-Object { $_.URI -ne $null}
$Command= $Xml.SelectNodes("//*").ChildNodes | Select Command| Where-Object { $_.Command -ne $null}
$arraylisttable = New-Object System.Collections.ArrayList
$arraylisttable.Add($URI)  | Out-Null
foreach($cmd in $Command)
{
$arraylisttable.Add($Cmd) | Out-Null
}
$arraylisttable | fl
输出:
希望能帮助到你。