赞
踩
# 可以在执行中文语句前加上
chcp 65001
# 或者,将整个.bat文件编译成utf-8的文件
chcp 65001
type script.bat > script_utf8.bat
# 增加 setlocal enabledelayedexpansion、 chcp 65001
chcp 65001
setlocal enabledelayedexpansion
set /p "foldersToPackage=请输入需要打包的文件夹的绝对路径(用空格分隔):"
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" 的错误。延迟变量扩展允许在循环中使用 `!` 符号来引用变量的值,而不是 `%` 符号。
# 在执行: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" 命令。
总结起来,"%变量%" 是普通的变量引用方式,而 "!变量!" 是启用了延迟变量扩展的方式,用于在同一行中使用变量的更新值。
@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 © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。