CMD批处理一些冷门命令,编写windows脚本常用?
场景1:
考虑一种情况,需要使用变量对变量循环替换这个时候,如果不加以一些特殊的设置,很有可能出现与预设的结果不相符的情况,这个时候可以通过设置这样一个命令来避免这个问题。
解决方式:
setlocal enabledelayedexpansion
用于启用延迟扩展(Delayed Expansion)模式,在启用延迟扩展后,! 可以用来获取变量的值。默认模式下,批处理执行代码块会提前替换变量的值,因此如果在一个代码块中改变了变量的值,这个时候改后的值在获取的时候一般都是错误的。启用延迟扩展后,可以使用 ! 来延迟获取变量的值,使得在代码块内部修改变量后,可以正确地获取到修改后的值。
endlocal 用于结束由 setlocal 开始的本地环境,恢复到调用 setlocal 之前的环境状态。
在批处理脚本中,setlocal 用于创建一个本地环境,这个本地环境中的变量和状态只对当前批处理文件有效,不会影响到其他批处理文件或者批处理文件的外部环境。endlocal 用于关闭这个本地环境,恢复到调用 setlocal 之前的环境状态。
场景2:
考虑一个平常的中文显示乱码问题
解决方式:
chcp 65001
这行命令放在行首,设置读取方式为utf-8进行读取,后续的中文输出将不会进行换行。
场景3:
考虑一个情况,我要写一个安装环境脚本,这个时候为了避免电脑重启,于是不修改注册表,使用手动修改的方式来即时生效,然后在脚本中通过start来启动一个需要设置的应用,然后我想要使得这个设置完以后,脚本在继续执行下去的话。
解决方式:
start /wait notepad
设立一个wait选项这个时候,等记事本程序关闭以后,脚本自动继续向下执行。
这里来一个以上大杂烩的测试代码
chcp 65001 >nul
@echo off
rem 这里需要注意一个点,如果你有别的语言基础的话,可能会习惯性的为了美观在编程语句中加空格
rem 这里如果加了空格取值方式会不一样,要格外注意,我这里贴一个加空格的
rem 同样的代码就是因为加了空格导致输出不一样
set var = 231
echo %var%
echo 不加延迟拓展时的取值方式
set var=231
echo %var%
:: 你们可以尝试不加下面这行,会发现出现奇奇怪怪的问题
setlocal enabledelayedexpansion
echo 加延迟拓展时的取值方式
set var1=120
echo !var1!
for /l %%i in (1,1,5) do (
set /a val =%%i
@echo !val!
@echo.
)
@echo 我真牛逼
start /wait notepad
@echo 你真牛逼!
@pause
一些零碎的知识点。
用于提取文件夹的名字。
@echo off
setlocal enabledelayedexpansion
rem 设置要处理的文件夹路径
set "folderPath=D:\download"
rem 遍历文件夹
for /d %%i in ("%folderPath%\*") do (
rem 获取文件夹名
set "folderName=%%~nxi"
echo !folderName!
rem 清除字母
set "folderNameWithoutLetters="
for /L %%j in (0, 1, 9) do (
set "folderName=!folderName:%%j=!"
)
rem 重命名文件夹
ren "%%i" "!folderNameWithoutLetters!"
)
endlocal
@pause