当前位置:   article > 正文

.bat脚本错误踩坑记录_bat is not recognized as an internal or external c

bat is not recognized as an internal or external command

.bat脚本打印中文输出乱码

# 可以在执行中文语句前加上
chcp 65001
# 或者,将整个.bat文件编译成utf-8的文件
chcp 65001
type script.bat > script_utf8.bat

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行.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=请输入需要打包的文件夹的绝对路径(用空格分隔):"
  • 1
  • 2
  • 3
  • 4

执行.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" 的错误。延迟变量扩展允许在循环中使用 `!` 符号来引用变量的值,而不是 `%` 符号。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

关于%sourceTemp%的坑

# 在执行:set /p "sourceTemp=请输入项目所在的父级文件夹绝对路径(如: D:\test\source): 后,输入时有值的
if not exist "%sourcePath%" (
	# 居然是能进来的,为什么呢?
	# 因为:
	# 使用 `set /p` 命令接收用户输入时,无法直接将输入值赋给变量,因为 `set /p` 命令会将用户输入视为变量名,而不是变量值。
	# setlocal enabledelayedexpansion 在set之前加上这个
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

隐藏命令行输出过程

`>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` 只能隐藏标准输出,而错误输出仍然会显示在命令行中。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

%% 和 !! 有什么区别

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

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

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

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

setlocal enabledelayedexpansion
set count=10
for /L %%i in (1,1,10) do (
    set /A count-=1
    echo Current count: !!count!!
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

%变量% 和 !变量! 有什么区别

1. "%变量%":这是最常见的变量引用方式。在批处理脚本中,你可以使用 "%变量%" 来引用和展开一个变量。当脚本执行时,"%变量%" 将会被替换为变量的实际值。例如,如果你设置了一个变量 "name=John",你可以使用 "%name%" 来引用该变量的值。

2. "!变量!":这是启用了延迟变量扩展的方式。默认情况下,批处理脚本会在执行时对变量进行解析,然后将其替换为相应的值。但是
,如果你希望在同一行中使用变量的更新值,你可以启用延迟变量扩展。在这种情况下,你可以使用 "!变量!" 来引用和展开变量。例如,如果你设置了一个变量 "count=10",并且在循环中对其进行递减,你可以使用 "!count!" 来引用更新后的值。

为了启用延迟变量扩展,你需要在脚本的开头使用 "setlocal enabledelayedexpansion" 命令。

总结起来,"%变量%" 是普通的变量引用方式,而 "!变量!" 是启用了延迟变量扩展的方式,用于在同一行中使用变量的更新值。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

优雅的退出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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/76599
推荐阅读