我需要在运行时将ID和密码传递给批处理文件,而不是将它们硬编码到文件中.
这是命令行的样子:
test.cmd admin P@55w0rd > test-log.txt
Run Code Online (Sandbox Code Playgroud) 我需要测试是否设置了变量.我已经尝试了几种技术,但他们忽视了,只要%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批处理文件,它将三个文本文件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是否存在和/或是否为空.我也不知道如何有条件地设置这些值.这可能吗?任何建议,将不胜感激.
我有一个简单的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) 我有一个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特殊字符?
我想根据字符串列表检查批处理文件的参数是否有效.
例如:
IF %1 IN validArgument1, validArgument2, validArgument3 SET ARG=%1
Run Code Online (Sandbox Code Playgroud)
只有匹配时,这才会将ARG设置为其中一个有效参数.理想情况下不区分大小写.
我有一个部署脚本,我必须将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
C:\>batinjection OFF ^& DEL c.c
Run Code Online (Sandbox Code Playgroud)
batinjection.bat的内容为 ECHO %*
我听说过SQL注入,虽然我从来没有真正做过,但这是注入吗?是否有不同类型的注射,这是其中之一?
或者还有另一个技术术语吗?还是一个更具体的术语?
注意 - 之前的编辑有 C:\>batinjection OFF & DEL c.c(即没有^%)和ECHO %1(即没有%*)这是不正确的.我纠正了它.它不会影响答案.
我想使用传递给批处理文件的前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) 在处理我之前的问题时,我遇到了一个我最初解决的类似问题.
实际上,我本月花了一些时间尝试创建一个通用的.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"并明确援引 …
基本上,下面的脚本可以以三种不同的方式使用:call foo
.bat boot_up "path".bat halt "path".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) batch-file ×11
windows ×4
cmd ×3
command-line ×2
arguments ×1
caret ×1
command ×1
dos ×1
escaping ×1
parameters ×1
security ×1
shell ×1
string ×1