在批处理文件中获取原始参数或命令

Posted

技术标签:

【中文标题】在批处理文件中获取原始参数或命令【英文标题】:Get raw arguments or command in batch file 【发布时间】:2021-01-20 13:49:15 【问题描述】:

在批处理文件中,有没有办法获取原始参数或命令?例如,给定以下批处理文件:

echo "%1"

然后运行:

my-file.bat ^1.1

我希望它输出^1.1,但^ 是一个特殊字符——转义字符——所以它被评估并且%1 包含1.1

可以通过在输入命令时转义插入符号来解决此问题(例如my-file.bat ^^1.1),但这在我的情况下是不希望的,因为我正在构建一个也具有 shell 实现的跨平台工具(其中提供^1.1 作品)。

所以我想知道:

    有没有办法获取“^1.1”的原始未评估参数文本? 或者有没有办法获取原始命令字符串或最后执行的命令文本?然后我可以接受这个并进行自己的解析。

谢谢!

【问题讨论】:

你是如何传递的,你发送到批处理文件的内容到底是什么,被评估为%1?我也很怀疑你的意图是真的echo 它,那么你对那个输入参数做了什么? @Compo echo "%1" 以批处理文件为例。它在 cmd 中调用它,例如 my-file.bat ^1.1。我想以某种方式在批处理文件中使用插入符号获取^1.1,但%1 包含1.1 而不是^1.1。我意识到这是因为^ 是一个转义字符。 当你说你在 cmd 中调用它时,这是否意味着你打开了一个 cmd.exe 窗口,my-file.bat 的目录作为你的当前目录,你在物理上输入 @ 987654340@ 并按下[ENTER] 键?我还问您打算对输入参数做什么。我问是因为你刚刚输入了它,所以应该已经知道你输入了什么。您一定是在用它执行其他任务! @Compo my-file.batcmd.exe 窗口的当前目录中包含文本echo "%1" 的文件。我正在输入my-file.bat ^1.1 并按回车键。输出是1.1,但我想要的输出是^1.1。是的,为了这个问题,我只是将问题简化为一个非常简单的例子。我想以某种方式将^1.1 的输入批量存储在一个变量中,然后我会用它做其他事情。 我不想要这个简化的例子,因为没有人会在现实世界的批处理脚本中做你正在做的事情。您显然打算将参数用于 echo 以外的其他内容,攻击此问题的最佳方法是其中的一部分,而不是仅仅在其中粘贴不需要的 echo 并希望得到满足的答案脚本的真正目的。 【参考方案1】:

简短:你不能

Long:您无法获取任何组合,但可以获取很多。

插入符号是最有问题的字符,因为它会转义下一个字符并在构建参数之前将其删除。 因此无法获得原始的原始输入。

但存在或多或少的防弹技术。 大多数情况下的最佳解决方案:SO:How to receive even the strangest command line parameters? 有一些小缺点Same but can also fetch CR and LF

但是如果您通过外部进程调用批处理文件,则可以使用cmdcmdline 变量,这是最好的解决方案,因为可以很容易地访问参数。

顺便说一句。稍后在您的颂歌中,您可能会遇到另一个问题。 当您尝试使用完全相同的参数调用另一个批处理或可执行文件时,您必须先将它们转义。 连那部分都不容易

【讨论】:

谢谢!我只是在使用kerne32.dll's GetCommandLine 在批处理文件之外进行了一些测试,但这似乎也不可能。 你现在能理解@DavidSherret,为什么我坚持要知道脚本的意图是什么,而不是仅仅假设echo %1 的答案就足够了。 @DavidSherret 在这种情况下,Compo 是正确的。从命令行、每次拖放或通过其他进程调用批处理的方式有很大不同。每个变体都有不同的规则和部分解决方案。 cmd.exe 是一个非常讨厌的野兽 正如我所说,是有人在 cmd.exe 进程的命令行中手动输入命令。感谢 Jeb 回答了我是否可以获得用户在批处理文件中输入的原始命令行文本的问题。 @Compo 我可以,但这与我的问题无关。

以上是关于在批处理文件中获取原始参数或命令的主要内容,如果未能解决你的问题,请参考以下文章

25.cp命令

批处理命令通过通配符名称获取最新文件

shell脚本或R脚本中参数含有空格的处理方法

如何在批处理文件中识别用户输入帮助(/?)

从批处理文件中的命令行参数返回退出代码

批处理文件:删除提升的权限(以原始用户身份运行命令)