batch-file - 如何接收最奇怪的命令行参数?

标签 batch-file escaping

如另一个线程How to avoid cmd.exe interpreting shell special characters like < > ^中所述
从命令行获取所有参数并不容易。

一个简单的

set var=%1
set "var=%~1"


还不够,如果您有这样的要求

myBatch.bat abc"&"^&def


我有一个解决方案,但是它需要一个临时文件,并且也不是防弹的。

@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!'


它失败,并显示诸如myBatch.bat%a之类的错误,它显示4而不是%a

在这种情况下,简单的回声%1将起作用。
显然这是for循环,但我不知道如何更改。
也许存在另一个简单的解决方案。

我不需要这个来解决实际的问题,但是我喜欢在每种情况下(不仅在大多数情况下)都是防弹解决方案的解决方案。

最佳答案

除了无法读取参数中的换行符,我认为没有人发现此漏洞:

@echo 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


以上内容来自热烈的DosTips讨论-http://www.dostips.com/forum/viewtopic.php?p=13002#p13002。 DosTips用户Liviu提出了关键的SETLOCAL DisableExtensions部分。

关于batch-file - 如何接收最奇怪的命令行参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4200316/

相关文章:

rest - 在RESTful架构中实现类似批处理操作的最佳方法?

windows - 批处理文件以取消阻止从互联网复制的文件

windows - CALL 通过时百分号消失

php - 转义用户发送的数据?

java - 在 Ant 中将分号作为参数传递

java - 字符串中 JSON 控制字符的转义

batch-file - 如何为命令答案创建批处理变量=?

java - 通过使用BAT文件执行Jar文件

php - 错误 - 使用批处理文件运行 php 文件

filter - Solr 过滤器 fq 中的特殊字符