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

这边给一个批处理的类数组操作的处理,展示了不同的分割方式。

@echo off
set temp1=sad,dsad,jisdf,dsf
for %%i in (%temp1%) do (
      @echo %%i
)
set temp1=sad dsad jisdf dsf
for %%i in (%temp1%) do (
      @echo %%i
)
set temp1=sad;dsad;jisdf;dsf
for %%i in (%temp1%) do (
      @echo %%i
)
set temp1=sad.dsad.jisdf.dsf
for %%i in (%temp1%) do (
      @echo %%i
)
pause
PowerShell Set-NetAdapterAdvancedProperty -Name "CCD101" -RegistryKeyword "*JumboPacket" -RegistryValue 9014 
@pause

———————————————————————————————————————————

25年3月18号在更新一个内网扫描脚本

@echo off
chcp 65001>nul
setlocal enabledelayedexpansion 
set /a number=1
:start
@ping -w 1 -n 1 192.168.78.!number! >nul&& echo 192.168.78.!number!
@set /a number+=1

REM 这边可以得出一个结论就是echo打印这个比较的值的时候会直接输出而不是输出结果
echo test>nul
REM 这边是打算测试用的
echo test>nul
::echo (!number! LSS 20)

@if !number! LSS 255 (goto start)
echo 扫描完毕
@pause

其实一些对于高级属性的操作更多是在powershell中去执行,在cmd中的有些操作会比较受限。

其次的话,在cmd中有一个针对上一条命令执行状态信号量,可以通过%errorlevel%该信号量去判断上一个是否执行成功来做出下一步操作。

一般来说,上一条命令的执行结果返回的值只有两个,"成功”用0表示,“失败”用1表示。

但是的话,实际上errorlevel的返回值可以在0~255之间,在一个命令执行结束可以表示不同的状态

一般实际应用的话用0和非0来判断的话会比较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忆林520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值