我需要在运行批处理文件时传递一个ID和密码,而不是将它们硬编码到文件中。

下面是命令行的样子:

test.cmd admin P@55w0rd > test-log.txt

当前回答

我写了一个简单的read_params脚本,可以作为函数(或外部.bat)调用,并将所有变量放入当前环境中。它不会修改原始形参,因为函数是用原始形参的副本调用的。

例如,给定以下命令:

myscript.bat some -random=43 extra -greeting="hello world" fluff

Myscript.bat将能够在调用函数后使用变量:

call :read_params %*

echo %random%
echo %greeting%

函数如下:

:read_params
if not %1/==/ (
    if not "%__var%"=="" (
        if not "%__var:~0,1%"=="-" (
            endlocal
            goto read_params
        )
        endlocal & set %__var:~1%=%~1
    ) else (
        setlocal & set __var=%~1
    )
    shift
    goto read_params
)
exit /B

限制

不能加载无值的参数,例如-force。你可以使用-force=true,但我想不出一种方法来允许空值,而不知道提前知道一个参数列表,不会有一个值。


更新日志

2/18/2016 不再需要延迟扩展 现在通过查找- before形参来处理其他命令行参数。

其他回答

没有必要把事情复杂化。例如,它只是命令%1 %2参数,

@echo off

xcopy %1 %2 /D /E /C /Q /H /R /K /Y /Z

echo copied %1 to %2

pause

“pause”显示批处理文件所做的工作,并等待您按下ANY键。将其保存为Windows文件夹中的xx.bat。

要使用它,输入,例如:

xx c:\f\30\*.* f:\sites\30

这个批处理文件负责所有必要的参数,比如只复制文件、更新的文件等等。在Windows出现之前,我就开始使用它了。如果您喜欢在复制文件时查看文件名,可以省略Q参数。

如果你想智能地处理缺失的参数,你可以这样做:

IF %1.==. GOTO No1
IF %2.==. GOTO No2
... do stuff...
GOTO End1

:No1
  ECHO No param 1
GOTO End1
:No2
  ECHO No param 2
GOTO End1

:End1

每个人的回答都很复杂,但实际上很简单。%1 %2 %3等是解析到文件的参数。%1是参数1,%2是参数2,以此类推。

所以,如果我有一个bat脚本包含这个:

@echo off
echo %1

当我运行批处理脚本时,我输入这个:

C:> script.bat Hello

脚本将简单地输出:

Hello

这对于脚本中的某些变量非常有用,比如名字和年龄。如果我有一个这样的脚本:

@echo off
echo Your name is: %1
echo Your age is: %2

当我输入这个:

C:> script.bat Oliver 1000

我得到这样的输出:

Your name is: Oliver
Your age is: 1000
FOR %%A IN (%*) DO (
    REM Now your batch file handles %%A instead of %1
    REM No need to use SHIFT anymore.
    ECHO %%A
)

这个循环遍历批处理参数(%*),不管它们是否带引号,然后回显每个参数。

简单的解决方法(即使问题已经很老了)

Test1.bat

echo off
echo "Batch started"
set arg1=%1
echo "arg1 is %arg1%"
echo on
pause

CallTest1.bat

call "C:\Temp\Test1.bat" pass123

输出

YourLocalPath>call "C:\Temp\test.bat" pass123

YourLocalPath>echo off
"Batch started"
"arg1 is pass123"

YourLocalPath>pause
Press any key to continue . . .

其中YourLocalPath是当前目录路径。

为了简单起见,将命令参数存储在变量中,并使用变量进行比较。

它不仅写起来简单,而且维护起来也很简单,所以如果后来其他人或你在很长一段时间后阅读了你的脚本,它将很容易理解和维护。

内联编写代码:参见其他答案。