澄清……这是原始代码此时的样子
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%"=="*what should be here"' 句子中的引号之间应该有什么,以将该输入直接传递到 nmap 行中..
有没有想知道 'if /I "%para%"=="" goto :para' 的目的是为了防止错误,如果用户只是按 Enter 而不写任何东西..
您需要“引用比较的双方”并使用变量的内容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这样再次要求输入(?可能去扫描?)
请注意,a 中的冒号goto
不是必需的,除非有特殊说明goto :eof
,意思是“转到批处理文件的末尾”
一旦确定para
不为空,则公正call :check
并传递的内容para
。这将执行一个名为 的子程序check
。如果子例程名称没有冒号,则子例程在check.bat
. 如果它有一个冒号,则子程序是“内部的”——该批代码中的一个标签。
该例程:check
将设置一个变量error
为或是空(如果没有错误),或者什么,这将是错误的参数。因此,如果error
未定义,则nmap
使用输入的参数执行,然后(转到 :eof 终止批处理 - 我不知道你想在这里做什么......) - 注意&
连接指令。
如果error
设置,则显示它并返回标签:para
(您可能会放在pause
这里,否则cls
会清除消息)
最后我们有:check
例行程序。
%~1
意思是“从提供给子例程的第一个参数中删除任何封闭的引号”
所以 - 设置error
为空然后检查"%~1"
每个有效的参数元素 - 我只展示了 2,因为我不知道这里的要求。只需添加更多检查来代替...
如果发现参数有效,则转到标签:parmok
。如果所有测试都失败,则将其放入error
并终止例程(返回到call :check
with error
set non-empty之后的行,指示错误)。
在 处:parmok
,我们使用 ashift
删除第一个参数并将扩孔器沿一个位置移动。返回:check
测试新的第一个参数,直到检查完所有参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句