【问题标题】:Preprocessor to add functionality to Windows's CMD?预处理器向 Windows 的 CMD 添加功能?
【发布时间】:2010-02-16 16:54:41
【问题描述】:

作为 SQL Server DBA,我需要编写大量脚本。有时,我需要将修复脚本部署到非常受限的环境中,其中唯一的脚本选项可能是 DOS Batch。在这样的环境中,甚至 VBScript/WSH 都不可能,更不用说 PowerShell。任何在 DOS 和 Windows 上编写过足够多的批处理文件的人都知道,当您需要做任何过于复杂的事情时,它是非常有限的并且是一个巨大的 PIA。对于使用过 Unix shell 脚本、Perl、Tcl、Python、Ruby 等的人来说尤其如此。

一个可能的解决方案是 CMD 预处理器,它可以从功能更强大的脚本语言中添加一些有用的功能。我试图找到这样的实用程序,但到目前为止我还没有运气。

这最终引出了我的问题:有人知道这样的 CMD 预处理器吗?如果没有,您希望在其中看到什么功能?


附录:
如果您不熟悉预处理器的概念,请参阅this Wikipedia entry

为了澄清,我正在考虑一个可以添加以下功能的工具:

  1. 功能
  2. Backtick (`) ala Unix shell

...可能还有其他人。这是我希望 CMD 拥有的两个功能,并且可以想办法用 CMD 预处理器来实现它们。可以使用 env vars 和 GOTO/labels 来实现功能;通过管道到临时文件并使用 set /p =

您已经可以实现这些相同的目的,但它变得非常乏味和冗长 - 这就是我想到让预处理器处理此类功能的样板的想法的原因。

示例

使用反引号的示例,这里是我假设的 Batch++ 中未处理的代码示例和已处理的 vanilla 批处理脚本,准备好由 CMD.exe 运行:

Batch++ 源代码 (test.batpp)

copy `dir /b /s c:\ | find "CADR-README.htm"` \\srv01\users

通过预处理器运行它

bpp test.batpp > post_test.bat

生成的 CMD/BAT 代码 (post_test.bat)

dir /b /s c:\ | find "CADR-README.htm" > _bt001.tmp
set /p _BT001 =< _bt001.tmp
copy %_BT001% \\srv01\users
set _BT001=
del _bt001.tmp

【问题讨论】:

    标签: windows command-line batch-file preprocessor cmd


    【解决方案1】:

    我不确定您的问题是否正确。如果您在不允许您运行任何脚本扩展的受控环境中运行,您将如何访问这样的预处理器?

    但是,对于您要求的两个功能,您可以使用 .BAT。当前 Windows 版本中的 BAT 处理支持这两个功能。

    1. 功能:您拥有扩展的 CALL 语法,支持通过参数引用 %1 .. %9 传递参数,并通过使用 %~ 语法的扩展替换得到增强。阅读HELP CALL

    2. 反引号:不确定您想要什么,但是在FOR /F 命令中,您可以传递一个反引号字符串以运行并捕获其输出。阅读HELP FOR

    【讨论】:

    • 如果您不熟悉预处理器的概念,请参阅此 Wikipedia 条目:en.wikipedia.org/wiki/Preprocessor 限制性部署环境正是想到预处理器的原因。在我自己的机器上,我可以用这个 CMD++ 编写脚本,其中包括。新功能和语法糖。对于部署,我会像使用任何其他预处理器一样使用它:通过预处理器运行 CMD++ 源代码,它会输出普通的 CMD 代码。有关反引号作用的描述,请参阅:learnlinux.tsf.org.za/courses/build/shell-scripting/…
    • 我知道的一些预处理器会生成 .EXE 代码,您也无法运行这些代码。据我所知,没有一个会导致 .BAT。希望这里的人可以提供帮助。关于反引号,我相信 FOR /F 完全符合您的需要。试试FOR /F %A IN ('date /t') DO ECHO %A'
    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2010-11-26
    • 2021-06-02
    • 2015-07-15
    • 2014-02-24
    • 1970-01-01
    相关资源
    最近更新 更多