本帖最后由 djwdj 于 2022-8-4 12:51 编辑
由于每次访问仓库,都要接入学校内网,手动开启步骤有点长。作为小学生,不能累坏了。所以决定搞个脚本
开始搞:
REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable
首先找到这个开关,得知0关1开
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f
这个就是脚本一键开启
看到有大佬写了一个自动切换脚本,但是我喜欢半自动,所以加了一个pause。每次打开先显示状态,不用就直接关闭。
直接看有点不显眼。所以搞变色
color /?
设置默认的控制台前景和背景颜色。
COLOR [attr]
attr 指定控制台输出的颜色属性。
颜色属性由两个十六进制数字指定 -- 第一个
对应于背景,第二个对应于前景。每个数字
可以为以下任何值:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
这个是全局,我要突出一个状态就行。于是找到findstr 。这东西也不是很好用,没有linux那么直接。
变色的只有文件名,
输出的有:[文件名]:[文件内容]
多余的文件内容和冒号要去掉,看到大佬的方案prompt $H获得[退格][空格][退格]
SETLOCAL EnableDelayedExpansion
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
set "DEL=%%a"
)
大概的思路就是文件内容是退格,就把冒号退掉。这样只剩变色的名字。
就为了提取退格,要写这么多,还要开启延时。小学生哪记得那么多啊,咱们直接点:ALT+08。直接打出退格字符。在记事本上显示一个正方框,在文本编辑器中显示的是一个黑块里面有BS。按住ALT再按08就可以松开ALT。苹果键盘option是ALT
发现两个问题:
1、少按一个零也不行,要两位数以上才生效,所以要在前面补零。
2、字母上面的数字无效,要小键盘的。
轻薄本没有小键盘,这也太痛苦了,那就用上面大佬的脚本改
SETLOCAL EnableDelayedExpansion
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
set /p ".=%%a" > BS.txt
)
这样就生成一个有退格字符的文本:[退格][空格][退格]
先上脚本再解释:
exit
:se
pushd %tmp%
set /p= <nul>%2
findstr /a:%1 .* %2*
del %2
exit /b
上面内容直接加到写好的脚本尾部,然后调用就行了
两个实验:
1、写一个退格到文件内容,如果后面有echo.遇到echo 的换行,冒号就出来了
2、写两个退格到文件内容,冒号也出来了。大概是退格把退格给退格了。
总结:不和echo一起的时候可以只写一个退格。常态还是写[退格][空格][退格]
一个事故:因为有del 给****变色的时候,把所有文件都删除了。想起 一年级的时候用rm -rf /
解决:pushd %tmp%把工作目录切换到临时文件
@echo off
for /f "tokens=1,2,* " %%i in ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable ^| find /i "ProxyEnable"') do (set /A ProxyEnableValue=%%k)
if %ProxyEnableValue% equ 0 (
set s0=关闭
set s1=开启
set k=1
)else if %ProxyEnableValue% equ 1 (
set s0=开启
set s1=关闭
set k=0
)
set #="++++++"
echo 系统代 理目前状态处于:
::echo %s0%
call:se cf %#%
echo.
call:se cf %s0%
echo.
call:se cf %#%
echo.
echo 按任意键%s1%代 理
pause>nul
echo 正在%s1%代 理,请稍候...
echo=
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d %k% /f
echo 系统代 理已%s1%,请按任意键关闭本窗口...
pause>nul
exit
:se
pushd %tmp%
set /p= <nul>%2
findstr /a:%1 .* %2*
del %2
exit /b
日记补充:
解读下面这行
for /f "tokens=1,2,* " %%i in ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable ^| find /i "ProxyEnable"') do (set
首先注册表查询得到的结果
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
ProxyEnable REG_DWORD 0x0
用find匹配到有数据的一行, 去掉注册表路径了
ProxyEnable REG_DWORD 0x0
for /f来分割数据%i获得第一个数据%j第二个%k第三个
刚好我们需要的是第三个,所以使用%k
一个故事
昨天把else 后面的if删掉了之后,脚本就错了。然后想着,那么复杂的事情不是小学生该想的。
今天又想了想,就两个条件,还用一个else if,这也太费了。最后决定研究一下其他大佬的文章。找了很多也没找到这个问题。还没确诊怎么下药,先cmd 再bat,就找到病因了。原来是else不能连着括号,在java上习惯了else贴着大括号。
同时整理一下,大佬们写的要点
if 语句与左括号 ( 同行
else语句与右括号 ) 同行
右括号 ) 不与 else if 同行, 右括号 ) 后面加上续行操作符 ^
else语句与左括号 (不能贴着,要有空格
单行if else 可以不用括号,由于 del 命令需要用新的一行终止,del必须用括号
|