批处理修改注册表
1、批处理注释
以下内容摘抄至 https://blog.csdn.net/wh_19910525/article/details/8125762
在批处理中**,段注释**有一种比较常用的方法:
goto start
= 可以是多行文本,可以是命令
= 可以包含重定向符号和其他特殊字符
= 只要不包含 :start 这一行,就都是注释
:start
另外,还有 其他各种注释形式,比如:
1、:: 注释内容(第一个冒号后也可以跟任何一个非字母数字的字符)
2、rem 注释内容(不能出现重定向符号和管道符号)
3、echo 注释内容(不能出现重定向符号和管道符号)〉nul
4、if not exist nul 注释内容(不能出现重定向符号和管道符号)
5、:注释内容(注释文本不能与已有标签重名)
6、%注释内容%(可以用作行间注释,不能出现重定向符号和管道符号)
7、goto 标签 注释内容(可以用作说明goto的条件和执行内容)
8、:标签 注释内容(可以用作标签下方段的执行内容)
2、批处理数组的使用
类似C语言中的数组,直接初始化
set Domain[0]=sopsa.bocsys.cn
set Domain[1]=ssop2.bocsys.cn
set Domain[2]=ssop.bocsys.cn
set Domain[3]=ssopomriis.p.bocsys.cn
set Domain[4]=vatims-vims.p.bocsys.cn
set Domain[5]=imse.bank-of-china.com
set Domain[6]=iccd-dapvip1.p.bocsys.cn
set Domain[7]=gms.bocsys.cn
set Domain[8]=e.bocsys.cn
数组大小长度的统计,如下脚本
set "x=0"
:GetSumLoop
if defined Domain[%x%] (
rem call echo %%Domain[%x%]%%
set /a "x+=1"
GOTO :GetSumLoop
)
rem echo %x%
set /a DomainSize="x"
3、批处理获取用户sessionid
for /f "skip=1" %%a in ('quser') do set curuser=%%a
set curuser=%curuser:~1%
for /f "delims=" %%a in ('wmic userAccount where "Name='%curuser%'" get SID /value') do call set %%a >nul
set "SID=%SID: =%"
4、批处理注册表操作
REG QUERY "%sRegPath%\!regKeyItem!" >nul 2>&1
REG ADD "%sRegPath%\!regKeyItem!\!regSubKeyItem!" >nul 2>&1
REG ADD "%sRegPath%\!regKeyItem!\!regSubKeyItem!" /v http /t REG_DWORD /d 1 /f >nul 2>&1
REG ADD "%sRegPath%\!regKeyItem!\!regSubKeyItem!" /v https /t REG_DWORD /d 1 /f >nul 2>&1
5、延迟变量
可以参见https://www.cnblogs.com/habibah-chang/p/3532125.html
延迟变量只会应用在复合语句中,例如for循环中的(),if条件语句中的(),延迟变量的意思就是延迟读取变量值,否则读取的是变量的初始值。
在批处理中开启或关闭延迟环境变量用setlocal命令:
setlocal EnableDelayedExpansion //开启延迟环境变量
setlocal DisableDelayedExpansion //关闭延迟环境变量
6、完整代码
@echo off
REM 声明采用UTF-8编码
rem chcp 65001 >nul 2>&1
set Domain[0]=sopsa.bocsys.cn
set Domain[1]=ssop2.bocsys.cn
set Domain[2]=ssop.bocsys.cn
set Domain[3]=ssopomriis.p.bocsys.cn
set Domain[4]=vatims-vims.p.bocsys.cn
set Domain[5]=imse.bank-of-china.com
set Domain[6]=iccd-dapvip1.p.bocsys.cn
set Domain[7]=gms.bocsys.cn
set Domain[8]=e.bocsys.cn
set regKeyItem=
set regSubKeyItem=
set nCount=0
set valuedot=.
set nIndex=0
set nStartIndex=0
set sRegPath=
set sValueSite=
setlocal enabledelayedexpansion
echo IE config start
for /f "skip=1" %%a in ('quser') do set curuser=%%a
set curuser=%curuser:~1%
for /f "delims=" %%a in ('wmic userAccount where "Name='%curuser%'" get SID /value') do call set %%a >nul
set "SID=%SID: =%"
set "sRegPath=HKEY_USERS\%SID%\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains"
echo %sRegPath%
REG QUERY "%sRegPath%" >nul 2>&1
if errorlevel==1 (
echo reg path error.
goto endproc
)
set "x=0"
:GetSumLoop
if defined Domain[%x%] (
rem call echo %%Domain[%x%]%%
set /a "x+=1"
GOTO :GetSumLoop
)
rem echo %x%
set /a DomainSize="x"
set sum=0
:recycleLoop
rem echo "nStartIndex=!nStartIndex!"
for /L %%n in (!nStartIndex!,1,!DomainSize!) do (
set /a nStartIndex=%nStartIndex+1
set sValueSite=!Domain[%%n]!
set valueString=!Domain[%%n]!
set ValueTemp=!Domain[%%n]!
rem 初始化sum,记录每个site分割子串长度
set "sum=0"
rem 计算分割词总数
:split
for /f "tokens=1,* delims=." %%i in ("!valueString!") do (
set /a sum=%sum+1
set "valueString=%%j"
)
if not "!valueString!"=="" goto split
rem echo "sum=!sum!"
set "nCount=0"
rem 字符串分割位置索引 aa.bb.cc.dd, nIndex为regSubKeyItem的截止位置,nStart为regKeyItem的开始位置
set /a nIndex=!sum!-2
set /a nStart=%nIndex%+1
rem 开启变量延迟扩展
setlocal enabledelayedexpansion
set "regSubKeyItem="
set "regKeyItem="
rem 取项regKeyItem与子项regSubKeyItem
:getItem
for /f "tokens=1,* delims=." %%i in ("!ValueTemp!") do (
set /a nCount=%nCount+1
if !nCount! LSS !nIndex! set "regSubKeyItem=!regSubKeyItem!%%i!valuedot!"
if !nCount! EQU !nIndex! set "regSubKeyItem=!regSubKeyItem!%%i"
if !nCount! EQU !nStart! set "regKeyItem=!regKeyItem!%%i"
if !nCount! GTR !nStart! set "regKeyItem=!regKeyItem!!valuedot!%%i"
set "ValueTemp=%%j"
)
if not "!ValueTemp!"=="" goto getItem
rem 执行注册表写入操作,判断regKeyItem是否存在
if not "!regKeyItem!"=="" (
REG QUERY "%sRegPath%\!regKeyItem!" >nul 2>&1
if errorlevel==1 (
REG ADD "%sRegPath%\!regKeyItem!" >nul 2>&1
rem 查询项不存在
if errorlevel==1 (
echo "reg add %sRegPath%\!regKeyItem! error"
) else if errorlevel==0 (
rem 判断子项是否存在
if not "!regSubKeyItem!"=="" (
REG QUERY "%sRegPath%\!regKeyItem!\!regSubKeyItem!" >nul 2>&1
rem 查询子项存在
if errorlevel==0 (
REG ADD "%sRegPath%\!regKeyItem!\!regSubKeyItem!" /v http /t REG_DWORD /d 1 /f >nul 2>&1
REG ADD "%sRegPath%\!regKeyItem!\!regSubKeyItem!" /v https /t REG_DWORD /d 1 /f >nul 2>&1
echo !sValueSite! add success.
) else if errorlevel==1 (
REG ADD "%sRegPath%\!regKeyItem!\!regSubKeyItem!" >nul 2>&1
if errorlevel==0 (
REG ADD "%sRegPath%\!regKeyItem!\!regSubKeyItem!" /v http /t REG_DWORD /d 1 /f >nul 2>&1
REG ADD "%sRegPath%\!regKeyItem!\!regSubKeyItem!" /v https /t REG_DWORD /d 1 /f >nul 2>&1
echo !sValueSite! add success.
) else if errorlevel==1 (
echo "reg add %sRegPath%\!regKeyItem!\!regSubKeyItem! error"
)
)
) else if "!regSubKeyItem!"=="" (
REG ADD "%sRegPath%\!regKeyItem!" /v http /t REG_DWORD /d 1 /f >nul 2>&1
REG ADD "%sRegPath%\!regKeyItem!" /v https /t REG_DWORD /d 1 /f >nul 2>&1
echo !sValueSite! add success.
)
)
) else if errorlevel==0 (
rem 判断子项是否存在
if not "!regSubKeyItem!"=="" (
REG QUERY "%sRegPath%\!regKeyItem!\!regSubKeyItem!" >nul 2>&1
rem 查询子项存在
if errorlevel==0 (
REG ADD "%sRegPath%\!regKeyItem!\!regSubKeyItem!" /v http /t REG_DWORD /d 1 /f >nul 2>&1
REG ADD "%sRegPath%\!regKeyItem!\!regSubKeyItem!" /v https /t REG_DWORD /d 1 /f >nul 2>&1
echo !sValueSite! add success.
) else if errorlevel==1 (
REG ADD "%sRegPath%\!regKeyItem!\!regSubKeyItem!" >nul 2>&1
if errorlevel==0 (
REG ADD "%sRegPath%\!regKeyItem!\!regSubKeyItem!" /v http /t REG_DWORD /d 1 /f >nul 2>&1
REG ADD "%sRegPath%\!regKeyItem!\!regSubKeyItem!" /v https /t REG_DWORD /d 1 /f >nul 2>&1
echo !sValueSite! add success.
) else if errorlevel==1 (
echo reg add %sRegPath%\!regKeyItem!\!regSubKeyItem! error
)
)
) else if "!regSubKeyItem!"=="" (
REG ADD "%sRegPath%\!regKeyItem!" /v http /t REG_DWORD /d 1 /f >nul 2>&1
REG ADD "%sRegPath%\!regKeyItem!" /v https /t REG_DWORD /d 1 /f >nul 2>&1
echo !sValueSite! add success.
)
)
)
)
if not !nStartIndex!==!DomainSize! goto recycleLoop
endlocal
:endproc
echo IE config end
上述代码是通过写入注册表的方式配置IE安全站点