如何接收最奇怪的命令行参数?
如何接收最奇怪的命令行参数?
如在另一个帖子中讨论的(如何避免cmd.exe解释特殊字符像 < > ^),从命令行获取所有参数并不容易。\n一个简单的\n
set var=%1 set "var=%~1"
\n是不够的,如果你有这样的请求\nmyBatch.bat abc\"&\"^&def\n
\n我有一个解决方案,但它需要一个临时文件,而且也不是百分之百可靠。\n
@echo off setlocal DisableDelayedExpansion set "prompt=X" ( @echo on for %%a in (4) do ( rem #%1# ) ) > XY.txt @echo off for /F "delims=" %%a in (xy.txt) DO ( set "param=%%a" ) setlocal EnableDelayedExpansion set param=!param:~7,-4! echo param='!param!'
\n它在类似myBatch.bat %a的情况下失败,它显示4而不是%a\n在这种情况下,一个简单的echo %1会起作用。
\n显然是for循环的问题,但我不知道如何更改它。
\n也许还有其他简单的解决方案。\n我不需要解决实际问题,但我喜欢那些在任何情况下都是百分之百可靠的解决方案,而不仅仅是在大多数情况下。
如何接收最奇怪的命令行参数?
在处理命令行参数时,有时候会遇到一些奇怪的情况,例如多行参数或者带有换行符的参数。本文介绍了一种解决这个问题的方法,即“syntax-error-technic”(语法错误技术)。
使用这种方法,甚至可以接收多行参数和带有回车字符的参数,没有已知的参数会失败。但是,这种解决方法的缺点是主进程会退出,只有一个子进程继续运行。
这是因为使用了一个无效的括号块“( Prepare ) PARAMS...”创建了一个语法错误,但是语法错误本身会输出完整的块,包括“%*”的扩展值。输出被重定向到一个文件中,使用了“permanent redirect technic”(永久重定向技术)。
子进程可以从文件中检索到完整的参数。这种解决方法在批处理文件只处理参数并且总是在之后退出时非常有用。
以上是解决这个问题的方法的具体代码实现。
如何接收最奇怪的命令行参数?
这个问题的出现是因为上述代码的作者发现这段代码无法读取参数中的换行符。为了解决这个问题,作者在DosTips论坛上发起了讨论,并得到了许多有用的建议。其中,用户Liviu提出了关键的SETLOCAL DisableExtensions
解决方案。
要解决这个问题,我们可以使用Liviu提供的代码片段。首先,我们需要将代码嵌入到一个批处理文件中。然后,在需要读取参数的位置,我们可以使用以下代码:
off setlocal enableDelayedExpansion set argCnt=1 :getArgs >"%temp%\getArg.txt" <"%temp%\getArg.txt" ( setlocal disableExtensions set prompt=# echo on for %%a in (%%a) do rem . %1. echo off endlocal set /p "arg%argCnt%=" set /p "arg%argCnt%=" set "arg%argCnt%=!arg%argCnt%:~7,-2!" if defined arg%argCnt% ( set /a argCnt+=1 shift /1 goto :getArgs ) else set /a argCnt-=1 ) del "%temp%\getArg.txt" set arg
这段代码使用了SETLOCAL DisableExtensions
命令来禁用扩展。然后,它通过将参数写入一个临时文件并从该文件中读取参数来解析命令行参数。最后,参数被存储在一个名为arg
的变量中。
通过使用上述代码,我们可以接收带有换行符的最奇怪的命令行参数。这对于处理一些非常特殊的命令行参数场景非常有用。