batch-file - 我们如何使用批处理脚本读取文件的第二行?
问题描述
我想检索包含几行文本的文件 (install.cfg) 的第二行。我尝试使用以下代码,该代码在我的本地机器上运行良好,但在 Windows 机器上执行时,它会抛出 'þ@' 无法识别为内部或外部命令、可运行程序或批处理文件
for /f "tokens=1*delims=:" %%G in ('findstr /n "^" install.cfg') do if ( %%G equ 2 SET VERSION=%%H )
解决方案
我建议在 ASCII/ANSI/OEM(每个字符一个字节)而不是 Unicode(UTF-8或UTF-16,每个字符多个字节)编码的批处理文件中使用此代码:
for /F "usebackq skip=1 delims=" %%G in ("install.cfg") do set "VERSION=%%G" & goto HaveValue
:HaveValue
echo Version read from file: %VERSION%
Windows 命令处理器在命令行环境中默认使用的字符编码是在 CMD 窗口中运行命令(更改代码页)时输出的,不带chcp
任何参数,并且取决于为所使用的设置的地区/国家/地区设置用户帐号。建议(通常但并非总是)使用与Windows 命令处理器在用于运行批处理文件的环境中默认使用的相同字符编码和代码页编写批处理文件,尤其是在包含字符的批处理文件上代码值大于 U+007F(非 ASCII 字符)。
FOR期望文件install.cfg
被编码为每个字符一个字节。只要版本字符串仅由 ASCII 字符组成,也可以不带或带字节顺序标记install.cfg
的UTF-8 编码。在双击批处理文件时加载的默认命令行环境中,使用此代码的命令FOR无法直接处理UTF-16 编码。install.cfg
要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
echo /?
for /?
goto /?
set /?
推荐阅读
- mysql - 查询结束时的多个窗口定义
- javascript - 从 axios 实例拦截器导航到其他屏幕
- c - 为什么 yyparse() 会导致我的程序崩溃?
- laravel - 在具有 distinct() 的关系上使用 withCount()
- php - 是否有不同的方法将数组存储到会话变量中而不重复?
- bash - 为什么 `bash -c '...'` 会在某些(但不是全部)错误上提前终止?
- ruby - 如何使用 'ruby -e' 执行多行程序?
- spring-boot - 通过 spring kafka 发送时,landoop/fast-data-dev 中的 kafka 消息数据类型错误
- matlab - 在MATLAB的嵌套for循环中保存每次迭代的结果?
- ant - Netbeans 11 不会将库复制到 dist 文件夹中