将功能添加到Windows的预处理器';是CMD吗?

将功能添加到Windows的预处理器';是CMD吗?,windows,command-line,batch-file,preprocessor,cmd,Windows,Command Line,Batch File,Preprocessor,Cmd,作为SQL Server DBA,我需要在工作中编写一些脚本。有时,我需要将修复脚本部署到一个非常受限的环境中,其中脚本的唯一选项可能是DOS批处理。在这样的环境中,甚至VBScript/WSH都不可能,更不用说PowerShell了。任何在DOS和Windows上编写了足够多批处理文件的人都知道,当您需要做任何过于复杂的事情时,批处理文件非常有限,而且是一个巨大的PIA。对于那些使用过unixshell脚本、Perl、Tcl、Python、Ruby等的人来说尤其如此 一个可能的解决方案是使用C

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

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

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


附录:

如果您不熟悉预处理器的概念,请参阅

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

  • 功能
  • …可能还有其他人。这是我希望CMD拥有的两个特性,我可以想出一种用CMD预处理器实现它们的方法。可以使用env vars和GOTO/label实现函数;通过管道传输到临时文件并使用set/p=<将结果读入到环境变量,来进行反标记

    您已经可以实现这些相同的目的,但它变得非常乏味和冗长——这就是我如何想到让一个预处理器来处理这些特性的样板文件的原因

    示例

    使用backticks示例,下面是我假设的Batch++和已处理的vanilla批处理脚本中未处理代码的示例,准备由CMD.exe运行:

    Batch++源代码(test.batpp)

    通过预处理器运行它

    bpp test.batpp > post_test.bat
    
    产生的CMD/BAT代码(post_test.BAT)

    dir/b/s c:\\查找“CADR-README.htm”>\u bt001.tmp
    设置/p\U BT001=<\U BT001.tmp
    复制%\u BT001%\\srv01\users
    设置_BT001=
    del_bt001.tmp
    
    我不确定能否正确解释您的问题。如果您在不允许运行任何脚本扩展的受控环境中运行,您将如何访问这样的预处理器

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

  • 函数:您有扩展的
    调用
    语法,支持参数通过参数引用%1..%9,并通过使用
    %~
    语法的扩展替换进行了增强。阅读
    帮助电话

  • Backtick:不确定您想要什么,但是在
    FOR/F
    命令中,您可以传递一个Backtick字符串以运行并捕获其输出。阅读的帮助


  • 如果您不熟悉预处理器的概念,请参阅以下Wikipedia条目:限制性部署环境正是预处理器出现的原因。在我自己的机器上,我可以用这个CMD++编写脚本,其中包括新的功能和语法。对于部署,我会像使用任何其他预处理器一样使用它:通过预处理器运行CMD++源代码,该预处理器输出普通的CMD代码。要了解backtick的作用,请参阅:我知道的一些预处理器会生成.EXE代码,您也无法运行这些代码。我知道,没有一个会导致蝙蝠。希望这里有人能帮忙。关于backtick,我相信FOR/F正是您所需要的。请尝试('date/t')中的/F%A执行回显%A'
    bpp test.batpp > 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