CMD批处理一些冷门命令,编写windows脚本常用?

发布于:2025-03-13 ⋅ 阅读:(30) ⋅ 点赞:(0)

场景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