djwdj 发表于 2022-8-3 22:48

小学生日记 bat

本帖最后由 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      指定控制台输出的颜色属性。

颜色属性由两个十六进制数字指定 -- 第一个
对应于背景,第二个对应于前景。每个数字
可以为以下任何值:

    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必须用括号

yulinsoft 发表于 2022-8-4 08:53

cick 发表于 2022-8-4 09:55

我本地用vpn也想搞成一键 不惧怕密集的桌面还是放弃了桌面东西太多 用启动器 加载大多数应用了

HUAJIEN 发表于 2022-8-3 23:33

你确定这个是小学生日记{:301_999:}

tl;dr 发表于 2022-8-4 06:26

lizooo 发表于 2022-8-4 08:21

幼儿园喂奶班的表示看不懂{:1_923:}:eee:'(weeqw

Incoparab 发表于 2022-8-4 08:54

我是小学生,快教我学这个

MI20220721 发表于 2022-8-4 09:04

这个是成品还是半成品,不太懂,学习中!

0xchang 发表于 2022-8-4 09:09

学习学习

lorzl 发表于 2022-8-4 09:29

胎儿觉得这晦涩难懂!

hqnnqh 发表于 2022-8-4 09:32

页: [1] 2 3
查看完整版本: 小学生日记 bat