BAT批处问题?

乱码原因Windows的cmd.exe默认编码格式为ANSI简体中文版的Windows, 其ANSI对应微软Codepage为cp936大致等同于GBK编码如果你的bat文件是UTF-8编码的, 或者是是其他Codepage下创建的, 比如Windows日语版下创建的bat文件, 保存为ANSI编码时对应cp932, 即Shift-JIS编码Windows繁体中文版下创建的bat文件, 保存为ANSI编码时对应cp950, 即Big5编码当bat文件编码与当前cmd环境不一致时, 双击执行时就会乱码解决方法方法1将bat文件转换成你当前操作系统的编码比如将UTF-8格式bat文件, 右键编辑, 然后选文件另存, 指定为ANSI编码, 保存然后再执行就正常了方法2假如你的bat文档是日文格式的或其他格式, 首先需要将bat文件的编码转换到UTF-8格式会python的话可以参考我的另一篇博客《记录一些最近用过的编码转换》https://blog.csdn.net/watfe/article/details/65935342复制出一些字符串或者是字节集, 跑码识别一下看是什么的编码的然后用文本工具或是python代码实现转换def decoding(path,fromcode,tocode):# 以bytes形式读取bat内容with open(path,'rb') as f:b = f.read()print(b)# 解码另存为'temp.bat'with open('temp.bat', 'w', encoding=tocode) as f:s = b.decode(fromcode,errors='ignore')f.write(s)decoding('dir.bat','gbk','utf-8')
得到UTF-8格式的bat文件接下来需要将你的cmd也调整到utf-8将以下内容保存为cmd_UTF-8.reg然后运行Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
"CodePage"=dword:0000fde9
此时cmd环境也就变成了UTF-8的然后此时再执行bat文件就不会乱码了至于后续将cmd恢复回默认也很简单将以下内容保存为cmd_ANSI.reg然后运行即可Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
"CodePage"=-
}
最近在弄jenkins,需要用到bat command,就到处找相关问题,期间学到一些东西,有也踩过一些坑,这里借助CSDN记录下来,总结下学到的知识和解决的问题。数组创建数组数组在批处理脚本中没有专门定义为类型,但是可以实现。当在批处理脚本中实现数组时,需要注意以下事项。需要用set命令定义数组的每个元素。需要使用’ for '循环来遍历数组的值。使用下面的set命令创建一个数组:set a[0]=1
另一种实现数组的方法是定义值列表并遍历值列表。下面的示例展示了如何实现这一点@echo off
set list=1 2 3 4
(for %%a in (%list%) do (
echo %%a
))
输出结果:1
2
3
4
Press any key to continue . . .
这个知识点帮我解决一个棘手的问题:问题背景: 上层传给我一个路径字符串 内容是四个文件 分别以分好分割 a/file1.txt;b/file2.tx2;c/file3.txt;d/file4.txt我需要提取这四个文件并且做性对应的处理,这里我需要解决两个问题,字符串路径的分割处理和数组的循环@echo off
set filelist=a/file1.txt;b/file2.tx2;c/file3.txt;d/file4.txt
for %%a in (%filelist%) do ( echo %%~nxa)
pause
输出结果:file1.txt
file2.tx2
file3.txt
file4.txt
Press any key to continue . . .
说明:%%~n 代表文件名%%~x 代表文件扩展名%%~nx 代表文件名和扩展名这里是引用
访问数组可以使用下标语法从数组中检索值,将要检索的值的索引直接在方括号中传递到数组的名称之后。@echo off
set a[0]=1
set a[1]=2
set a[2]=3
echo The first element of the array is %a[0]%
echo The second element of the array is %a[1]%
echo The third element of the array is %a[2]%
输出结果:The first element of the array is 1
The second element of the array is 2
The third element of the array is 3
遍历数组通过使用’ for '循环并遍历数组中的每个元素来实现对数组的迭代。下面的例子展示了一种实现数组的简单方法。@echo off
setlocal enabledelayedexpansion
set topic[0]=comments
set topic[1]=variables
set topic[2]=Arrays
set topic[3]=Decision making
set topic[4]=Time and date
set topic[5]=Operators
for /l %%n in (0,1,5) do (
echo !topic[%%n]!
)
pause
输出结果:The first element of the array is 1
The second element of the array is 2
The third element of the array is 3
for /l %%n in (0,1,5) 这行代码是for 循环的一种使用方式 for /L %%变量 in (起始值,每次增值,结束时的比较值) do 命令 , in (0,1,5) 会生成一个序列 [0,1,2,3,4],具体参考bat for in用法求数组长度数组的长度是通过迭代数组中的值列表来完成的,因为没有直接函数来确定数组中的元素数量。@echo off
set Arr[0]=1
set Arr[1]=2
set Arr[2]=3
set Arr[3]=4
set "x=0"
:SymLoop
if defined Arr[%x%] (
call echo %%Arr[%x%]%%
set /a "x+=1"
GOTO :SymLoop
)
echo "The length of the array is" %x%
pause
输出结果:1
2
3
4
"The length of the array is" 4
Press any key to continue . . .
数组结构体结构也可以在批处理文件中实现,使用一点额外的代码来实现。下面的示例展示了如何实现这一点。@echo off
set obj[0].Name=Joe
set obj[0].ID=1
set obj[1].Name=Mark
set obj[1].ID=2
set obj[2].Name=Mohan
set obj[2].ID=3
FOR /L %%i IN (0 1 2) DO
(
call echo Name = %%obj[%%i].Name%%
call echo Value = %%obj[%%i].ID%%
)
pause
输出结果:Name = Joe
Value = 1
Name = Mark
Value = 2
Name = Mohan
Value = 3
Press any key to continue . . .
总结
要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!如果这篇博客对你有帮助,请
“点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。当然执意选择白嫖也欢迎。}

我要回帖

更多关于 批处理方式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信