.bat脚本错误踩坑记录 您所在的位置:网站首页 layerstopng脚本出错 .bat脚本错误踩坑记录

.bat脚本错误踩坑记录

2024-06-18 19:22| 来源: 网络整理| 查看: 265

.bat脚本打印中文输出乱码 # 可以在执行中文语句前加上 chcp 65001 # 或者,将整个.bat文件编译成utf-8的文件 chcp 65001 type script.bat > script_utf8.bat 执行.bat脚本时遇到:is not recognized as an internal or external command, operable program or batch file. # 增加 setlocal enabledelayedexpansion、 chcp 65001 chcp 65001 setlocal enabledelayedexpansion set /p "foldersToPackage=请输入需要打包的文件夹的绝对路径(用空格分隔):" 执行.bat脚本时遇到:0 was unexpected at this time set "folderExist=0" for %%i in (%foldersToPackage%) do ( if not exist "%%i" ( set /a folderExist+=1 ) ) if %folderExist% gtr 0 ( echo. echo 输入的文件夹路径不存在,请检查输入的文件夹路径是否正确。 pause exit ) # 原因:这个错误通常是由于在批处理脚本中使用了延迟变量扩展(delayed variable expansion)导致的。 @echo off setlocal enabledelayedexpansion set "folderExist=0" for %%i in (%foldersToPackage%) do ( if not exist "%%i" ( set /a folderExist+=1 ) ) if !folderExist! gtr 0 ( echo. echo 输入的文件夹路径不存在,请检查输入的文件夹路径是否正确。 pause exit ) # 这样修改后,应该可以解决 "0 was unexpected at this time" 的错误。延迟变量扩展允许在循环中使用 `!` 符号来引用变量的值,而不是 `%` 符号。 关于%sourceTemp%的坑 # 在执行:set /p "sourceTemp=请输入项目所在的父级文件夹绝对路径(如: D:\test\source): 后,输入时有值的 if not exist "%sourcePath%" ( # 居然是能进来的,为什么呢? # 因为: # 使用 `set /p` 命令接收用户输入时,无法直接将输入值赋给变量,因为 `set /p` 命令会将用户输入视为变量名,而不是变量值。 # setlocal enabledelayedexpansion 在set之前加上这个 ) 隐藏命令行输出过程 `>nul` 将命令的输出重定向到空设备,这样就不会在命令执行时显示任何输出。 >nul 2>&1 和>nul 2>nul 有什么区别? `>nul 2>&1` 和 `>nul 2>nul` 都是将命令的输出重定向到空设备,但它们之间有一些区别。 `>nul 2>&1` 将标准输出和错误输出都重定向到空设备,这意味着命令的所有输出都将被隐藏。它的含义是: - `>nul` 将标准输出重定向到空设备。 - `2>&1` 将错误输出重定向到标准输出的位置,即也将其重定向到空设备。 `>nul 2>nul` 只将标准输出重定向到空设备,而错误输出仍然会显示在命令行中。它的含义是: - `>nul` 将标准输出重定向到空设备。 - `2>nul` 将错误输出重定向到空设备。 因此,使用 `>nul 2>&1` 可以完全隐藏命令的输出,而 `>nul 2>nul` 只能隐藏标准输出,而错误输出仍然会显示在命令行中。 %% 和 !! 有什么区别

在批处理脚本中,“%%” 和 “!!” 是特殊的字符序列,具有不同的含义:

“%%” 是用于循环中的变量。在批处理中,“%%” 通常用于 for 循环中,表示迭代变量。例如,你可以使用 “for %%i in (*.txt) do echo %%i” 来遍历当前目录下的所有 .txt 文件。

“!!” 是用于启用延迟变量扩展。默认情况下,批处理脚本在执行时会对变量进行解析,然后将其替换为相应的值。但是,如果你希望在同一行中使用变量的更新值,你可以启用延迟变量扩展。在这种情况下,你可以使用 “!!” 将变量括起来,以确保在执行时进行变量扩展。

例如,假设你在脚本中设置了一个变量 “count=10”,并且在循环中对其进行递减。如果你想在循环内部使用更新后的值,你可以将 “count” 包含在 “!!” 中,如下所示:

setlocal enabledelayedexpansion set count=10 for /L %%i in (1,1,10) do ( set /A count-=1 echo Current count: !!count!! )

这样,每次循环迭代时,“!!count!!” 将会被解析为更新后的值。

%变量% 和 !变量! 有什么区别 1. "%变量%":这是最常见的变量引用方式。在批处理脚本中,你可以使用 "%变量%" 来引用和展开一个变量。当脚本执行时,"%变量%" 将会被替换为变量的实际值。例如,如果你设置了一个变量 "name=John",你可以使用 "%name%" 来引用该变量的值。 2. "!变量!":这是启用了延迟变量扩展的方式。默认情况下,批处理脚本会在执行时对变量进行解析,然后将其替换为相应的值。但是 ,如果你希望在同一行中使用变量的更新值,你可以启用延迟变量扩展。在这种情况下,你可以使用 "!变量!" 来引用和展开变量。例如,如果你设置了一个变量 "count=10",并且在循环中对其进行递减,你可以使用 "!count!" 来引用更新后的值。 为了启用延迟变量扩展,你需要在脚本的开头使用 "setlocal enabledelayedexpansion" 命令。 总结起来,"%变量%" 是普通的变量引用方式,而 "!变量!" 是启用了延迟变量扩展的方式,用于在同一行中使用变量的更新值。 优雅的退出bat脚本程序 @echo off setlocal enabledelayedexpansion set "folderExist=0" for %%i in (%foldersToPackage%) do ( if not exist "%%i" ( set /a folderExist+=1 ) ) if !folderExist! gtr 0 ( echo. echo 输入的文件夹路径不存在,请检查输入的文件夹路径是否正确。 pause goto :EOF ) rem 执行其他操作 rem 跳转到脚本末尾的标签 :EOF rem 退出脚本 exit /b


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有