澄清..这就是原始代码在这一点上的样子
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键而不写任何内容,则意图是防止错误..
答案 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 :check
后error
设置为非空的行,表示错误)。< / p>
在:parmok
,我们使用shift
删除第一个参数并将重新取消器移到一个位置。返回:check
测试新的第一个参数,直到检查完所有参数。