相关疑难解决方法(0)

如何将参数传递给批处理文件?

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

这是命令行的样子:

test.cmd admin P@55w0rd > test-log.txt
Run Code Online (Sandbox Code Playgroud)

arguments batch-file

1100
推荐指数
17
解决办法
180万
查看次数

在批处理文件中测试参数是否为空的正确方法是什么?

我需要测试是否设置了变量.我已经尝试了几种技术,但他们忽视了,只要%1用双引号包围时,如情况%1"c:\some path with spaces".

IF NOT %1 GOTO MyLabel // This is invalid syntax
IF "%1" == "" GOTO MyLabel // Works unless %1 has double quotes which fatally kills bat execution
IF %1 == GOTO MyLabel // Gives an unexpected GOTO error.
Run Code Online (Sandbox Code Playgroud)

根据此站点,这些是受支持的IF语法类型.所以,我没有办法做到这一点.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
Run Code Online (Sandbox Code Playgroud)

windows shell cmd batch-file

194
推荐指数
9
解决办法
31万
查看次数

检查Windows批处理中的空变量

我正在开发一个Windows批处理文件,它将三个文本文件bcp到SQL Server中.如果在生产中出现问题,我希望能够覆盖文件名.所以我想做这样的事情.

bcp.exe MyDB..MyTable1 in %1 -SMyServer -T -c -m0
bcp.exe MyDB..MyTable2 in %2 -SMyServer -T -c -m0
bcp.exe MyDB..MyTable3 in %3 -SMyServer -T -c -m0
Run Code Online (Sandbox Code Playgroud)

我希望能够为所有三个文件输入默认名称,如果未提供位置参数,则使用该名称.这个想法要么是要执行

myjob.bat
Run Code Online (Sandbox Code Playgroud)

没有参数,并使用默认值或执行

myjob.bat "c:\myfile1" "c:\myfile2" "c:\myfile3"
Run Code Online (Sandbox Code Playgroud)

并让它使用这些文件.我无法弄清楚如何判断%1,%2和%3是否存在和/或是否为空.我也不知道如何有条件地设置这些值.这可能吗?任何建议,将不胜感激.

windows batch-file

66
推荐指数
4
解决办法
16万
查看次数

将带空格的路径作为bat文件的参数传递

我有一个简单的bat脚本,它将文件从已知目录复制到用户指定的目录.如何将路径(可能包含空格)传递给我的脚本并将其与xcopy命令一起使用?


在我的代码中,我有以下内容

:READ_PWA_PATH
    if "%1" == "" ( 
        rem Set default path
        set PWA_PATH="C:\Program Files\PWA"
        rem
        echo You have not specified your PWA url.
        echo Default will be assumed: C:\Program Files\PWA. 
        choice /C:YN /M:"Do you wish to continue [Y] or cancel the script [N]?"
            IF ERRORLEVEL ==2 GOTO CANCEL
            IF ERRORLEVEL ==1 GOTO READ_WSS_SERVER_EXTENSIONS_PATH
        GOTO END
    ) else (
        set PWA_PATH=%1
    )
Run Code Online (Sandbox Code Playgroud)

如果我只是调用脚本,我会收到以下错误:

C:\Projects\Setup>install.cmd "C:\program files (x86)"

-----------------
SETUP SCRIPT
-----------------

files was unexpected at this time.
C:\Projects\Setup>
Run Code Online (Sandbox Code Playgroud)

parameters command batch-file

58
推荐指数
5
解决办法
18万
查看次数

如何避免cmd.exe解释shell特殊字符,如<> ^

我有一个Windows CMD脚本,它接受许多参数并执行EXE,首先传递一些硬编码参数,然后传递用户的所有参数.CMD脚本如下所示:

launcher.exe paramX paramY %*
Run Code Online (Sandbox Code Playgroud)

用户将从Windows shell执行CMD脚本,如下所示:

launcher.cmd param1 param2 param3 [...]
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果参数到CMD脚本包含壳等特殊字符< >^,用户被迫通过前述各用3插入符号逸出这些^壳转义字符.

两个例子

1)要将参数传递ten>one给EXE,用户必须按如下方式启动CMD:

launcher.cmd ten^^^>one
Run Code Online (Sandbox Code Playgroud)

这样做的原因是,shell特殊字符^,并>通过命令外壳在两个层面解释,首先在命令行和第二的CMD脚本中.因此,使用脱字符^外壳转义字符转义的shell必须应用两次.问题是这对用户来说并不明显,看起来很难看.

对于这个例子,一个更好的解决方案是用双引号括起参数.但是,这会分解为更复杂的示例,其中包含参数中的文字双引号.

2)要将参数传递"^给EXE,用户必须按如下方式启动CMD:

launcher.cmd "\"^^^^"
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我想支持包含任何低ASCII字符序列的参数,不包括控制字符,即代码点0x20到0x7E.我知道会有一些例子,用户必须使用插入符号来逃避某些shell特殊字符.但是,我希望用户在这些情况下每次都必须使用3个插入符,因为它们恰好是在调用CMD脚本而不是EXE.

我可以通过使用执行相同操作的EXE替换CMD脚本来解决此问题.但是,有没有办法改变CMD脚本,以便它将参数传递给EXE而不解释shell特殊字符?

cmd escaping batch-file caret

12
推荐指数
2
解决办法
2万
查看次数

如何查找字符串是否在DOS批处理文件中的字符串列表中

我想根据字符串列表检查批处理文件的参数是否有效.

例如:

IF %1 IN validArgument1, validArgument2, validArgument3 SET ARG=%1
Run Code Online (Sandbox Code Playgroud)

只有匹配时,这才会将ARG设置为其中一个有效参数.理想情况下不区分大小写.

string dos batch-file

8
推荐指数
2
解决办法
1万
查看次数

我应该如何传递密码(包含特殊字符)作为命令行参数?

我有一个部署脚本,我必须将LDAP密码作为cmd参数传递给我.

实际密码:(  foo\$ser"ver\\ 1 包含三个空格字符:开头,之前1和之后1)

例如

...bin>deployment.bat LDAPPassword= foo\$ser\"ver\\ 1 
Run Code Online (Sandbox Code Playgroud)

注意:密码中有空格,如开头所示.

deployment.bat呼叫到上述参数被作为参数传递的类.问题是该类接收2个不同的参数:

args[0]= foo\$ser"ver\\            //The space after \\ is omitted
args[1]=1                          //The space before and after 1 is omitted
Run Code Online (Sandbox Code Playgroud)

如何传递此密码以便将其作为单个字符串接收?

我已经尝试过引用密码了

...bin>deployment.bat LDAPPassword=" foo\$ser"ver\\ 1 "
Run Code Online (Sandbox Code Playgroud)

但它不会起作用.

windows batch-file special-characters command-line-arguments

6
推荐指数
1
解决办法
5015
查看次数

这个批处理文件注入了吗?

C:\>batinjection OFF ^& DEL c.c
Run Code Online (Sandbox Code Playgroud)

batinjection.bat的内容为 ECHO %*

我听说过SQL注入,虽然我从来没有真正做过,但这是注入吗?是否有不同类型的注射,这是其中之一?

或者还有另一个技术术语吗?还是一个更具体的术语?

注意 - 之前的编辑有 C:\>batinjection OFF & DEL c.c(即没有^%)和ECHO %1(即没有%*)这是不正确的.我纠正了它.它不会影响答案.

security command-line batch-file code-injection

5
推荐指数
2
解决办法
2528
查看次数

如何将额外的额外参数传递给批处理文件?

我想使用传递给批处理文件的前2个参数,然后将其他所有内容附加到批处理文件中执行的命令.

有一个简单的方法吗?

// batch file
command -Duser=%1 -Dpwd=%2 {? how to pass all remaining arguments on the command line}
Run Code Online (Sandbox Code Playgroud)

批处理将像这样执行

batch.bat USR PWD -Dargument1=1 -Dargument2=2
Run Code Online (Sandbox Code Playgroud)

实际上,我希望执行以下内容

command -Duser=USR -Dpwd=PWD -Dargument1=1 -Dargument2=2
Run Code Online (Sandbox Code Playgroud)

batch-file command-line-arguments

5
推荐指数
1
解决办法
762
查看次数

批处理 - 如何正确分配可能包含引号的任意百分号(%1)或百分比星号(%*)参数?

在处理我之前的问题时,我遇到了一个我最初解决的类似问题.

实际上,我本月花了一些时间尝试创建一个通用的.bat帮助程序库,它将尽可能地使用任何名称处理拖放文件.我想对调用者透明地执行它,并向后兼容任何现有脚本,因此文件名以%1,%2的形式传递,我没有遇到任何问题.

@ MCND的解决方案是读取%CMDCMDLINE%然后棘手解析它.因此,我可以简单地编写set "a=%CMDCMDLINE:"=?%"- 并将完整的字符串放入变量A中,但内部的所有引号都会立即替换为问号?,从而导致我可以轻松处理的不带引号的行.

但它只适用于.bat拖放,因为这样我就无法读取从命令提示符传递的参数.我必须使用%*.

我目前的问题是:如果参数也可能包含引号字符,甚至不配对,如何阅读?

考虑以下BAT文件:(让我们调用"C:\ test.bat")

@echo off
echo START
setlocal enabledelayedexpansion

set a=%1
echo a=[!a!]

set b="%1"
echo b=[!b!]

set "c=%1"
echo c=[!c!]

set d=%~1
echo d=[!d!]

set e="%~1"
echo e=[!e!]

set "f=%~1"
echo f=[!f!]

set g=%*
echo g=[!g!]

set h="%*"
echo h=[!h!]

set "i=%*"
echo i=[!i!]

endlocal
echo DONE
exit /b
Run Code Online (Sandbox Code Playgroud)

基本上,它是一切,我能想象到读取进入批量("呼叫")百分比参数:形式%1,%~1,%*在不带引号set x=y,引用set "x=y"并明确援引 …

batch-file

5
推荐指数
1
解决办法
169
查看次数

使用可变数量的参数调用批处理文件

基本上,下面的脚本可以以三种不同的方式使用:call foo

  1. .bat boot_up "path"
  2. .bat halt "path"
  3. .bat ssh "path" "command"

我不能保证路径或命令没有空格.

当我使用foo.bat执行我的子程序时ssh,一切正常.相反,当我尝试调用我的子程序时,boot_up或者halt出现错误:

( was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)

但是,如果我向boot_upor 添加第三个参数halt,那么一切都会再次起作用.

所以我的问题是,如何使用变量长度的参数来管理批处理文件的调用?

:main
    echo Argument 1: (%1)
    echo Argument 2: (%2)
    echo Argument 3: (%3)

    call :set_cygwin_env || exit /b 1

    if not "%1"=="" if not %2=="" (
        if "%1"=="boot_up" (
            call :boot_up %2
        ) else if "%1"=="halt" (
            call :halt %2
        ) else if "%1"=="ssh" if not %3=="" …
Run Code Online (Sandbox Code Playgroud)

windows command-line cmd batch-file command-line-arguments

2
推荐指数
1
解决办法
733
查看次数