【问题标题】:How can I use a variable in BATCH's type command?如何在 BATCH 的 type 命令中使用变量?
【发布时间】:2020-06-19 10:01:36
【问题描述】:

我编写了一个小批处理脚本来将我的 html 文件解析为 cpp-Header 文件,以便我可以将其编译为 ESP8266 (PROGMEM)。脚本很简单:

@echo off
set /P filename=Enter File name (w/o .html extension): 
if exist "..\website\%filename%.html" (
    echo|set /p dummyvar=%filename%>beforetemp.txt
    type before.txt beforetemp.txt before2.txt "..\website\%filename%.html" after.txt > "..\server\%filename%html.h"
) else (
    echo FILE at website\%filename%.html DOES NOT EXISTS!
    pause
)
exit 0

在我添加可以输入要复制的文件名称的部分之前,一切正常。

所有完成的文件应该如下所示:

#include <arduino.h>

const char indexhtml[] PROGMEM = R"====(
<html>
...
</html>
)====";

但是当我运行脚本时,它会在 beforetemp.txt 的末尾插入一个空格字符,因此会在我的 indexhtml.h 文件中搞砸变量名。 before.txt beforetemp.txt before2.txt 的东西变成了

#include <arduino.h>

const char index html[] PROGMEM = R"====(

而不是

#include <arduino.h>

const char indexhtml[] PROGMEM = R"====(

问题是:如何将 before.txt 和 before2.txt 之间的 %filename% 的内容打印到我的新文件中?


这里是使用的文件:

before.txt

#include <arduino.h>

const char 

before2.txt

html[] PROGMEM = R"====(

之后.txt


)====";

【问题讨论】:

  • 为了明确一点:问题出在脚本的第 4 行,type 命令本身完美无缺,因为空格字符已经存在于 beforetemp.txt 文本文件中。
  • 你为什么使用type而不是copy从其他几个文件创建一个文件?打开command prompt,运行copy /? 并阅读输出帮助。可以运行copy 选项/B 和几个输入文件,它们之间有+ 和一个输出文件名,以将输入文件的内容按指定顺序复制到指定的输出文件中。 type 在使用多个文件名运行它时还会输出文件名,我怀疑这是否会产生有效的头文件。
  • &lt; nul set /P ="%filename%"替换echo|set /P dummyvar=%filename%
  • @aschipfl 完全按预期工作,非常感谢 :)

标签: batch-file cmd arduino windows-console


【解决方案1】:

我会建议以下内容:

before.txt

#include <arduino.h>

const char 

before2.txt

html[] PROGMEM = R"====(


after.txt


)====";

您使用以下批处理文件,使用Copy 而不是Type

@Echo Off
Set /P "filename=Enter HTML file name without extension: "
If Not Exist "..\website\%filename%.html" (
    Echo website\%filename%.html does not exist.
    %__AppDir__%\timeout.exe /T 5 /NoBreak > NUL
    Exit /B 2
)
< NUL Set /P "=%filename%" > "beforetemp.txt"
Copy "before.txt" + "beforetemp.txt" + "before2.txt" + "..\website\%filename%.html" + "after.txt" "..\server\%filename%html.h" /B
Exit /B %ErrorLevel%

请注意,这目前不会删除您的(可能现在不需要)beforetemp.txt,因此您可能希望在退出之前合并执行此操作的方法。

【讨论】:

  • 引用路径是一种很好的做法。 "%__AppDir__%\timeout.exe"
  • 我从来没有发现引用那个特定的实现是必要的,@lit。这是否是因为使用它的系统不再在带有空格或有问题的字符的位置使用 \system32 目录,这可能是原因。如果您能告诉我有充分的理由相信这个特殊的动态变量可能会解析为需要在 cmd.exe 所做的之外使用双引号的路径,我很乐意承认。
  • 我们无法控制__appdir__ 的值。只有微软这样做。微软可以把它想要的任何东西放在那里。这是防御性编程的好习惯。
  • 好吧,@lit 和@Compo,为什么不依赖PATH(还有PATHEXT)变量,就像Windows 上的许多程序和脚本一样?当您只声明timeout.exe(甚至timeout)时,它会不会更容易和更清晰?如果你真的想让你的脚本独立于变量,你可以在开始时检查甚至设置它(它们);在您的脚本中使用setlocal/endlocal 时,原始状态最终会恢复...
  • @aschipfl,我看到它的方式,相信我在这个网站上我做的次数比我预期的要多,%PATH%,变量经常被修改并且经常被错误地修改。此外,用户可以有意或无意地修改%SystemRoot%%WinDir% 等的内容,但不能对%__AppDir__% 进行修改。 %PATHEXT% 不那么重要,但是当我知道时,我认为没有理由不使用扩展名? 当我已经知道它要查找的信息时,我认为没有真正的理由让 cmd.exe 查找某些内容!
【解决方案2】:

正如我所说,问题出在我将 %filename% 回显到我的临时文件中的那一行。 我换行了

echo|set /p dummyvar=%filename%>beforetemp.txt

< nul set /P ="%filename%">beforetemp.txt

现在一切正常。


完整的批处理文件现在如下所示:

@echo off
set /P filename=Enter File name (w/o .html extension): 
if exist "..\website\%filename%.html" (
    < nul set /P ="%filename%">beforetemp.txt
    type before.txt beforetemp.txt before2.txt "..\website\%filename%.html" after.txt > "..\server\%filename%html.h"
) else (
    echo FILE at website\%filename%.html DOES NOT EXISTS!
    pause
)
exit 0

【讨论】:

  • 实际上,用户 Compo 已经在他的答案中加入了这一点,所以这个答案有点重复; (此外,Compo 甚至改进了拼接文件的方法,使用copy 代替了type...)
猜你喜欢
  • 2016-09-07
  • 1970-01-01
  • 2013-10-09
  • 2022-01-08
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多