我有这个防火墙状态的批处理代码并且它成功运行。但是当我想将状态和status2的位置更改为不同的位置(例如桌面)时,它不起作用。请帮助
Netsh firewall show state > status.txt
Find /C "Operational mode = Enable" "status.txt" >
status2.txt
For /f "skip=1 tokens=* delims= " %%a in (status2.txt) Do Set value2=%%a
Set value2=%value2:~23,1%
Del /F status.txt
Del /F status2.txt
If %value2%==0 exit
1 个答案:
答案 0 :(得分:0)
设置value2 =%value2:~23,1%强烈依赖于文件名长度。相反,使用Set" value2 =%value2:〜-1%"提取字符串中的最后一个字符。
另一种方法:不使用辅助文件
奖励:没有辅助文件,没有循环
脚本(注意模式环境变量仅用于演示注入,请参阅输出;此外,如果%value2%== 0出口命令省略用于调试目的):
@ECHO OFF
SETLOCAL EnableExtensions
rem EnableDelayedExpansion
设置"模式=%~1"
如果"%mode%" ==""设置"模式=启用"
rem祖传方法有所改善
Netsh防火墙显示状态> "%TEMP%\ status.txt中"
查找/ C"操作模式=%模式%" "%TEMP%\ status.txt中" > "%TEMP%\ status2.txt"
对于/ f" usebackq delims =" %% a in("%temp%\ status2.txt")Do Set" value2 = %% a"
设置" value2 =%value2:〜-1%"
Del / F"%temp%\ status.txt"
Del / F"%temp%\ status2.txt"
echo 2文件,find:value2 = [%value2%]
没有辅助文件的rem
设置" value2 ="
for / F" delims =" (%#);
Netsh防火墙显示状态^ |查找/ C"操作模式=%模式%"
')做Set" value2 = %% a"
echo no files,find:value2 = [%value2%]
rem没有辅助文件,没有`for`循环
设置" value2 ="
netsh firewall show state | findstr / R" Operational.mode。* =。%mode%$"> NUL
set / A" value2 = - (%errorlevel%-1)"
echo no files,no loop:value2 = [%value2%]
输出:
==> D:\ bat \ SO \ 33668356.bat启用
2个文件,找到:value2 = [1]
没有文件,找到:value2 = [1]
没有文件,没有循环:value2 = [1]
==> D:\ bat \ SO \ 33668356.bat禁用
2个文件,找到:value2 = [0]
没有文件,找到:value2 = [0]
没有文件,没有循环:value2 = [0]
==>
资源(必读):
(命令参考)Windows CMD命令行的A-Z索引
(其他特殊情况)Windows CMD Shell命令行语法
(%〜1,%% a等特殊页面)命令行参数(参数)
(>,> NUL,|等特殊页面)重定向
(^ |等特殊页面)转义字符,分隔符和引号