【问题标题】:Windows MessageQueue trigger and rule: Batch-File doens't work on first callWindows 消息队列触发器和规则:批处理文件在第一次调用时不起作用
【发布时间】:2017-08-14 16:42:21
【问题描述】:

我今天意识到一个非常奇怪的问题。我正在编写一个批处理文件,它使用 trigadm.exe 在特定的 Windows 消息队列上生成规则和触发器。

现在触发器和规则的创建不是问题,因为我已经测试了几次并且它可以工作。 我想要的是,首先检查规则和触发器是否已经存在。如果它们不存在,那么我将创建它们。当它们已经存在时,我不会做任何事情并退出批处理脚本。

当我通过 trigadm.exe 生成规则和触发器时,我总是得到一个用于规则的 GUID 和一个用于触发器的 GUID。为了稍后检查它们,我将这些规则保存到文本文件中。因此,当我检查它们是否存在时,我只是从文本文件中读出这些 GUID,如果存在具有特定 GUID 的规则或触发器,则使用 trigadm.exe 的方法。当规则或触发器存在时,我会收到一条消息作为输出:ID 为规则的详细信息:b5ea975a-efd6-444a-9ae5-2a366e723980...。如果规则或触发器不存在,我也会得到一个类似消息:失败:特定规则不存在。所以我将这条消息也保存到一个文件中,并检查内容是否包含单词:Details。如果它包含那个词,我不会创建规则或触发器。

所以主要问题是;当我尝试从 Windows 命令提示符调用批处理文件时,它在第一次调用时不起作用。我必须调用批处理文件大约 4 次,直到它起作用。

有人知道这里的问题可能是什么吗?

@ECHO OFF
IF EXIST C:\temp\WarehouseOrder\Installation\ruleId.txt (

    SET /p rId=<C:\temp\WarehouseOrder\Installation\ruleId.txt

    trigadm /request:GetRule /ID:%rId% > C:\temp\WarehouseOrder\Installation\msg.txt

    SET /p msg=<C:\temp\WarehouseOrder\Installation\msg.txt

    SET result=%msg:~0,7%

    IF "%result%" == "Details" (
        ECHO rule already exists > result.txt
    )
)

【问题讨论】:

  • 看看delayed expansion;您正在设置在一个带括号的代码块中读取相同的变量...
  • @aschipfl Thx,现在我明白为什么这不起作用了

标签: windows batch-file triggers msmq


【解决方案1】:

如果您不想使用延迟扩展,您可以重新构建脚本。

@ECHO OFF
IF NOT EXIST C:\temp\WarehouseOrder\Installation\ruleId.txt GOTO :EOF
SET /P "rId=<C:\temp\WarehouseOrder\Installation\ruleId.txt"
(trigadm /request:GetRule /ID:%rId%)>C:\temp\WarehouseOrder\Installation\msg.txt
SET /P "msg=<C:\temp\WarehouseOrder\Installation\msg.txt"
IF /I "%msg:~,7%"=="Details" ECHO=rule already exists>result.txt

【讨论】:

  • 这也有效。但我决定制作一个新的 C# 解决方案,并从那里使用控制台命令并通过 C# 处理文件读取。还是谢谢你
  • 仅仅因为您决定寻求问题参数之外的解决方案并不意味着不应将已发布的商定有效解决方案标记为正确。
  • 对不起伙计,我忘了这样做。现在我已将其标记为正确。
猜你喜欢
  • 2018-09-02
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多