【问题标题】:XMLstarlet and Windows Task manipulationXMLstarlet 和 Windows 任务操作
【发布时间】:2014-02-11 11:03:52
【问题描述】:

尝试使用xmlstarlet修改导出的windows任务

示例任务:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2014-02-10T11:57:03</Date>
    <Author>client</Author>
  </RegistrationInfo>
  <Triggers>
    <LogonTrigger>
      <StartBoundary>2014-02-10T11:57:00</StartBoundary>
      <Enabled>true</Enabled>
    </LogonTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>DOMAIN\client</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>HighestAvailable</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>P7D</ExecutionTimeLimit>
    <Priority>7</Priority>
    <RestartOnFailure>
      <Interval>PT1M</Interval>
      <Count>10</Count>
    </RestartOnFailure>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>"script"</Command>
    </Exec>
  </Actions>
</Task>

我想将&lt;DisallowStartIfOnBatteries&gt;true&lt;/DisallowStartIfOnBatteries&gt; 和&lt;StopIfGoingOnBatteries&gt;true&lt;/StopIfGoingOnBatteries&gt; 更改为“假”。

在 windows 1.5.0 版上使用 XMLStarlet 在我看来,这应该可行:

xml ed -u "Task/Settings/DisallowStartIfOnBatteries" -v false sampletask.xml

但它给了我: 没有一个 XPath 匹配;匹配默认命名空间中的节点 使用 '' 作为前缀(参见手册中的第 5.1 节)。 例如,使用 /:node 代替 /node

期待 5.1 下的男人,但我仍然没有变得更聪明:-( 测试过

xml ed -u -N k=http://schemas.microsoft.com/windows/2004/02/mit/task" /k:Task/Settings/DisallowStartIfOnBatteries" -v false IneraLogon.xml

但这给了我

failed to load external entity "k=http://schemas.microsoft.com/windows/2004/02/mit/task"

验证和http://schemas.microsoft.com/windows/2004/02/mit/task 似乎已关闭。

任何人对如何继续前进有建议吗?

我应该过去尝试使用 sed for windows 代替吗?

【问题讨论】:

    标签: xml sed xmlstarlet


    【解决方案1】:

    您的xml 文件使用默认命名空间,您必须在xpath 表达式中声明和使用该命名空间。

    用-N开关声明它(前缀名称不介意):

    -N n="http://schemas.microsoft.com/windows/2004/02/mit/task"
    

    并将其包含在xpath 表达式的所有元素中:

    -u "n:Task/n:Settings/n:DisallowStartIfOnBatteries"
    

    得到:

    xmlstarlet ed \
      -N n="http://schemas.microsoft.com/windows/2004/02/mit/task" \
      -u "n:Task/n:Settings/n:DisallowStartIfOnBatteries" \
      -v false \
    sampletask.xml
    

    【讨论】:

    • 谢谢!看起来可以工作,但我需要将它传送到一个新的 .xml 但我可以忍受!
    • 您可以使用-L或--inplace选项来修改原始文件。
    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多