我尝试在快捷方式中调用cmd,并使用set/p用户输入执行ping,但我没有解析var。我试着从简单到增强,但效果不佳:
%SystemRoot%system32cmd.exe /k set /p XYZ=IP? && ping %XYZ%
%SystemRoot%system32cmd.exe /k Setlocal EnableDelayedExpansion & set /p XYZ=IP? && ping %XYZ%
%SystemRoot%system32cmd.exe /k Setlocal EnableDelayedExpansion & set /p XYZ=IP? && ping %~XYZ%
%SystemRoot%system32cmd.exe /k Setlocal EnableDelayedExpansion & set /p XYZ=IP? && ping %%XYZ%
我想什么?
set /p XYZ=IP? && call ping %XYZ%
在一行中使用set
命令时,通过使用&
,直到该行结束时才会设置变量。要演示这一点,请将其作为批处理文件运行
输入:
set var=FALSE
set var=TRUE & Echo var state: %var%
Echo var state: %var%
Echo ----------------------------------------
set var=
set /p "var=: " & if not defined var Echo The variable var has no value
if defined var Echo The variable var is: %var%
输出:
var state: FALSE
var state: TRUE
----------------------------------------
The variable var has no value
The variable var is: test
正如您所看到的,您只能在一行代码中对变量的前一个值进行acc。你能做的最好的事情是:
C: \pingr.bat
setlocal
set var=%~1
if "%1"=="" "var=Ip: "
set /p target="%var%"
ping %target%
Endlocal
然后在cmd中,只需键入快捷键:
cmd /c "call C:pingr.bat Ip?"
你的问题应该得到解决。
Mona
如果希望延迟扩展,则必须使用!XYZ!
,并且SETLOCAL只能在批处理上下文中工作,而不能在命令行中工作。必须使用CMD.EXE /V:ON
选项为命令行启用延迟扩展。此外,命令字符串必须加引号,或者必须转义&&
,以便在SET命令之后而不是在CMD.EXE命令之后执行PING。
%SystemRoot%system32cmd.exe /v:on /k "set /p XYZ=IP? && ping !XYZ!"
你可以试试这个。我测试了一下,效果很好。在输出文件中,您将获得时间、日期和ICMP测试信息。
@echo Type an IP address. At the end press ctrl+c and choose N
@echo off
setlocal
set var=%~1
if "%1" ==" "var=Ip: "
set /p target="%var%"
for /F "delims=" %%i in ('ping %target% -t') do call :format "%%i"
goto :done
:format
echo %date% %time% %1 1>> output.txt
:done