【问题标题】:Bat script stops working in case if launched through AutoHotkey如果通过 AutoHotkey 启动 Bat 脚本会停止工作
【发布时间】:2017-09-15 02:09:15
【问题描述】:

尽管这个问题涵盖了 Windows CMD、AutoHotkey 和 MultiMarkdown,但我相信这个问题与 CMD 密切相关(我对 Windows bat 文件缺乏了解)。

所以...

我正在尝试为 MultiMarkdown 创建 AHK 脚本,这将允许将 mmd 文件转换为任何扩展名(不是特别是 html)。

这就是我可以使用普通 bat 文件的方式:

chcp 65001
set ext=mmd2html
for %%i in (*.md) do call multimarkdown --escaped-line-breaks --process-html --nosmart "%%i" > %%~ni.%ext%

这行得通。如果将此 bat 文件与 mmd 文件放在一起,它将正确转换和重命名它们。

但是,当我尝试将此代码放入 AHK 脚本时,它会失败。这是我所拥有的:

#SingleInstance, Force

f1::

bat_script =
(join&
chcp 65001
set ext=mmd2html
for `%i in (*.md) do call multimarkdown --escaped-line-breaks --process-html --nosmart "`%i" > `%~ni.`%ext`%
)

Run, %ComSpec% /c %bat_script%, %A_ScriptDir%
return

如何解决?


帖子更新

实际的问题是,不是像这样重命名文件:

my_test_file.md --> my_test_file.mmd2html (yes, "mmd2html" is an extension)

它按字面意思重命名:

my_test_file.md --> my_test_file.%ext%

换句话说,脚本不理解%ext% 是可变的。这是工作 AHK 代码,不使用 var:

f1::

bat_script =
(join&
chcp 65001
for `%i in (*.md) do call multimarkdown --escaped-line-breaks --process-html --nosmart "`%i" > `%~ni.aaaaaaaa
)

Run, %ComSpec% /c %bat_script%, %A_ScriptDir%
return

但是,我想要使用变量作为文件扩展名,所以这里发布的工作代码仅用于演示目的。

【问题讨论】:

  • 反引号是 AHK 转义吗?如果是这样,您的 AHK 对您的批次的 % 字符数是不同的。
  • @Magoo 是的,反引号是 AHK 转义字符。据我所知,如果 bat-script 从 bat 文件启动,我们应该使用 %%,如果相同的代码直接粘贴到 cmd 窗口中,我们应该使用单个 %。这就是我减少它们的原因。不过,我也试过for %%i in (*.md) do call multimarkdown --escaped-line-breaks --process-html --nosmart "%%i" > %%~ni.%ext%。它会立即关闭 cmd 窗口,没有任何效果。
  • “它失败了”不是很具体。但是您确定您的 AHK 脚本知道要处理哪个目录吗?试试for %i in ("c:\full path\*.md") do ...cd /d "c:\full path" & for %I in (*.md) do...(我会留给你适当的转义,因为我不会说AHK)
  • 或者,回应 Stephan 的担忧,如果 %A_ScriptDir% 指定了命令运行的“当前目录”,请确保指向 .md 文件所在的位置(我也不知道 AHK) .
  • @Stephan 是的,我确定,请参阅我之前的评论。 “失败”意味着不是将文件 my_test_file.md 重命名为 my_test_file.mmd2html,而是将其重命名为 my_test_file.%ext%。字面上地。出于某种原因,它不明白%ext% 是可变的。我已经更新了帖子。

标签: batch-file cmd autohotkey


【解决方案1】:

您需要转义内部括号。

for `%i in `(*.md`) do multimarkdown --escaped-line-breaks --process-html --nosmart "`%i">"`%~ni.`%ext`%"

虽然未经测试,但可能不需要转义内部左括号,只需确保您的块保持原样的右括号即可。您可以尝试将其作为替代方案并报告。

for `%i in (*.md`) do multimarkdown --escaped-line-breaks --process-html --nosmart "`%~i">"`%~ni.`%ext`%"

【讨论】:

  • 谢谢。第二个例子我已经试过很多次了,请参阅我的 cmets 到原始帖子。它不起作用——CMD 窗口立即关闭。顺便说一句,如果我不使用变量进行扩展,AHK 工作正常。我将在几分钟后更新我的帖子以显示有效的 AHK 代码。 (但我使用变量,所以它只是为了演示目的)。
  • 您根本没有提到尝试它,您的示例并没有逃脱括号,只有百分比。请在确保您的块的其余部分正确之后尝试我使用的内容。
  • 哦,对不起,我没有提到它。是的,我尝试了你的两个例子,即同时转义括号和单括号。它不起作用 - 窗口立即关闭。这一切都很奇怪。例如,如果我从代码中放弃 MultiMarkdown 并使用简单的“ren”命令,那么即使使用变量,它也能成功运行。
  • 有必要callmultimarkdown吗?你试过去掉call这个词吗?在每个测试中仅在 call 之前添加 ECHO 并查看是否将正确的命令输出到正确的文件名和扩展名?
  • Echo(实际上是call echo)在任何地方都可以正常工作(在for-line 之前和之后)。 Callmultimarkdown 之前似乎是必要的(也使用ren 命令而不是multimarkdown 进行了测试),但无论如何,我已经在有和没有call 的情况下对其进行了很多测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多