[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
论坛写的不一定都是正确的,所谓 "尽信书不如无书";实践是检验真理的唯一标准.
做实验最好把@echo on 打开,看看cmd的指令到底是执行的啥玩意!!!
每个for语句其实是一行指令,别看分行写,其实是一个指令;在执行该指令前,若没有开启变量延迟,那么cmd会对指令中的每个变量进行预赋值;若开启了变量延迟,cmd不会对变量进行预赋值;
你的第一个例子setlocal放在for内部的时候;在每个for指令前,未开启变量延迟,故变量if /i "!str:~,5!"=="HKEY_"一直是false,所以set skey=%%a就不会执行的.!skey!一直是空值.
第二个setlocal放到for外面,由于开启了变量延迟,在每次for指令执行前,str不会被预赋值,故能得到正确结果.

TOP

本帖最后由 flashercs 于 2018-12-5 15:46 编辑

cmd踩的坑多了去了.就像以前某论坛写cmd里stdout 的字符都是Unicode编码,一直信以为真,后来踩了坑才知道是错误的.
type和more都可以识别ansi和Unicode-BOM编码的文本,但type输出到console的文本编码与源文件一致,而more输出到控制台的编码是ANSI的,它是转码的;
findstr是按ANSI编码搜索字符串的,忽视文本编码,而find却可以正确识别编码.
dir 对于office文档格式的文件搜索是不准确的,比如dir *.doc ,搜索结果会包括.doc,.docx,.doct,.docm...等任何扩展名以.doc开头的文件.
管道|,在不指定Unicode输出时,| 前面的指令会转码成ANSI,这就会导致一些Unicode文件名的识别失败,虽然几率很小.比如dir /a /b /s *.txt|cscript -nologo a.js;让a.js来处理stdin 文本,但是若文件名含有无法转换成ANSI的Unicode字符就会变成?,比如文件名 "1👀💋🎶🚗0.txt",就会变成了"1????????0.txt",这显然是找不到该文件的.
这都是坑.不踩过能知道?

TOP

返回列表