batch - 直接将输入传递给if语句

时间:2017-03-26 07:57:00

标签: batch-file

澄清..这就是原始代码在这一点上的样子

echo[
echo         1 - Scan with service guess (-sF,-sV,-pN)
echo         2 - Quick nmap scan (May be blocked by firewalls)
echo         3 - Try to avoid Firewall (Very Slow)
echo         4 - Operation system (Will attempt to guess Operation System)
echo         5 - Choose own parameters (inactive at this time)
echo         6 - Go Back
echo[
set /p scan=Which kind of scan? 
if /I "%scan%"=="1" nmap.exe %target% -sF -T5 -Pn -sV --traceroute
if /I "%scan%"=="2" nmap.exe %target% -sS
if /I "%scan%"=="3" nmap.exe %target% --scan-delay 1 --badsum
if /I "%scan%"=="4" nmap.exe %target% -O
if /I "%scan%"=="5" goto :para
if /I "%scan%"=="6" goto :choice
if /I "%scan%"=="" goto :scan
pause
goto :scan
:para
cls
Echo put in the parameters for nmap to use
set /P para= which parameters to use?
if /I "%para%"=="*what should be here" nmap.exe %target% %para%
if /I "%para%=="" goto :para

我想做的是如果用户选择输入自己的参数(5),它会转到:para 然后要求用户输入要使用的nmap的自己的参数。

所以我的问题是 - ' if / I"%para%" ==" *应该在这里"& #39;将该输入直接传递到nmap行的句子..

是否有人想知道' if / I"%para%" ==""转到:para'如果用户只需按Enter键而不写任何内容,则意图是防止错误..

1 个答案:

答案 0 :(得分:0)

你需要引用比较的两面"并使用变量para

内容
if /I "%para%"=="*user input"

奇怪的是,与if scan完全相同......

(我不知道你为什么"引用每一行"。看起来很奇怪 - 而且我甚至都没试过......)

啊 - 您似乎想检查para的有效性。

Echo put in the parameters for nmap to use
set "para="
set /P para= which parameters to use?
if NOT DEFINED para goto para
call :check %para%
if not defined error nmap.exe %target% %para%&goto :eof
echo %error% is invalid
goto para

:check
set "error="
if "%~1"=="" goto :eof
if "%~1"=="-sS" goto parmok
if "%~1"=="-Pn" goto parmok
...
set "error=%~1"
goto :eof

:parmok
shift
goto check

首先,在请求输入之前清除para。如果用户只按 Enter ,那么para将保持不变,它将不会清除

接下来,检查是否定义了para。如果未定义,则用户只按 Enter ,再次请求输入(?可能会转到SCAN?)

请注意,goto中的冒号不需要除外,其中包含特殊说明goto :eof,这意味着"转到批处理文件的末尾" 34;

一旦我们确定para不为空,只需call :check并传递para的内容。这将执行一个名为check的子程序。如果子例程名称没有冒号,则子例程在check.bat中。如果它有冒号,那么子程序是"内部" - 此批次代码中的标签。

例程:check会将变量error设置为空(如果没有错误)或某些,这将是错误的参数。因此,如果未定义error,请使用输入的参数执行nmap,然后(转到:eof以终止批处理 - 我不知道您要在此处执行的操作...) - 请注意&连接说明。

如果设置了error,则显示它并返回标签:para(您可以将pause放在此处,否则cls将消除消息)

最后我们有:check例程。

%~1表示"从提供给子程序的第一个参数中删除任何封闭引号"

所以 - 将error设置为 nothing 然后针对每个有效参数元素检查"%~1" - 我只显示了2,因为我不知道这里的要求。只需添加更多支票代替...

如果发现参数有效,请转到标签:parmok。如果它未通过所有测试,则将其放入error并终止例程(返回到call :checkerror设置为非空的行,表示错误)。< / p>

:parmok,我们使用shift删除第一个参数并将重新取消器移到一个位置。返回:check测试新的第一个参数,直到检查完所有参数。