Batch file 如果通过自动热键启动,Bat脚本将停止工作

Batch file 如果通过自动热键启动,Bat脚本将停止工作,batch-file,cmd,autohotkey,Batch File,Cmd,Autohotkey,尽管这个问题涉及Windows CMD、自动热键和多重标记,但我相信,这个问题与CMD(我对Windows bat文件缺乏了解)密切相关 所以 我正在尝试为多重标记创建AHK脚本,它将允许将mmd文件转换为任何扩展名(而不是特定的html) 这就是我如何使用普通bat文件实现的: chcp 65001 set ext=mmd2html for %%i in (*.md) do call multimarkdown --escaped-line-breaks --process-html --no

尽管这个问题涉及Windows CMD、自动热键和多重标记,但我相信,这个问题与CMD(我对Windows bat文件缺乏了解)密切相关

所以

我正在尝试为多重标记创建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

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

您需要将内部括号转义

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`%"

回击是一种逃避吗?如果是这样,则AHK wrt批的
%
字符数不同。@Magoo是的,反勾号是AHK转义字符。我知道,如果从bat文件启动bat脚本,我们应该使用
%%
,如果相同的代码直接粘贴到cmd窗口,我们应该使用单个
%%
。这就是我减少它们的原因。但是,我也尝试了(*.md)中的
%
%I的
调用多标记--转义换行符--处理html--nosmart“
%
%I”>
%
%ni.
%ext
%
。它将立即关闭cmd窗口,没有任何效果。“它失败”不是很具体。但是您确定,您的AHK脚本知道要处理哪个目录吗?请尝试
中的%i(“c:\full path\*.md”)执行…
cd/d“c:\full path”&在(*.md)中的%i执行…
(我将留给您进行适当的转义,因为我不会说AHK),或者,响应Stephan的担忧,如果
%A_ScriptDir%
指定了命令运行的“当前目录”,确保指向
.md
文件所在的位置(我也不知道AHK)。@Stephan是的,我确定,请参阅我之前的评论。“它失败”意味着它没有将文件
my\u test\u file.md
重新命名为
my\u test\u file.mmd2html
,而是将其重命名为
my\u test\u文件。%ext%
。字面上出于某种原因,它不理解
%ext%
是可变的。我已经更新了帖子。谢谢。第二个例子我已经试过很多次了,请看我对原始帖子的评论。它不起作用——CMD窗口正在立即关闭。顺便说一句,如果我不使用变量进行扩展,AHK可以正常工作。我将在几分钟内更新我的帖子,以显示工作的AHK代码。(但我想使用variable,所以它只是为了演示的目的)。您根本没有提到尝试它,您的示例并没有脱离括号,只是百分比。请在确认你街区的其他部分正确无误后,再试试我用过的。哦,对不起,我没有提到。是的,我尝试了你的两个例子,即转义两个括号和一个括号。这不起作用——窗户马上就要关上了。这一切都很奇怪。例如,如果我放弃代码中的多重标记并使用简单的“ren”命令,那么即使使用变量,它也能成功工作。是否需要调用
多重标记?您是否尝试删除单词
call
?在每个测试中,只需在
call
之前添加
ECHO
,看看是否将正确的命令输出到了正确的文件名和扩展名?
ECHO
(实际上
call ECHO
)在任何地方都可以正常工作(在
for
-行之前和之后)
Call
before
multi-markdown
似乎是必要的(也使用
ren
命令而不是multi-markdown进行测试),但在任何情况下,我已经在使用和不使用
Call
的情况下对其进行了大量测试。