以管理员身份运行时出错:
BackGroundJob.exe'不被识别为内部或外部命令,可操作程序或批处理文件。
exe 和 bat 文件位于同一文件夹中。
当我在没有以管理员身份运行的情况下运行它时它会运行。但是要安装此.exe我需要从同一文件夹以管理员身份安装它。
ECHO OFF
CLS
:MENU
ECHO.
ECHO ...............................................
ECHO PRESS 1, 2 to select your task, or 3 to EXIT.
ECHO ...............................................
ECHO.
ECHO 1 - Install BackGroundJob
ECHO 2 - UnInstall BackGroundJob
ECHO 3 - EXIT
ECHO.
SET /P M=Type 1, 2, or 3 then press ENTER:
IF %M%==1 GOTO INSTALL
IF %M%==2 GOTO UNINSTALL
IF %M%==3 GOTO EOF
:INSTALL
CD %cd%
BackGroundJob.exe install
GOTO MENU
:UNINSTALL
CD %cd%
BackGroundJob.exe uninstall
GOTO MENU
给出的信息不多,所以这里有一个你可以尝试的镜头。
实际文件位置
似乎backgroundJob.exe
不在:
path
环境变量中的任何文件夹- 批处理脚本所在的文件夹
使用外部工具时,检查该工具是否存在且可访问始终是理想的。
如何确保文件存在
-
使用
IF EXIST filename.ext
- 这可以检查文件是否存在,进一步防止此类错误。
-
或者,使用
for
和where
知道文件的位置- 循环遍历目录并检索文件路径。
当前目录
CD %cd%
不是必需的,因为它只是将目录更改为当前目录。此行代码仅在之前编辑过%cd%
时才使用,不建议这样做。
用户 eryksun 提到,也许您当前的目录没有设置为批处理文件的目录。考虑添加cd /d %~dp0
。cd
更改目录,/d
启用驱动器更改,%~dp0
代表当前批处理脚本的驱动器和路径。
代码插入漏洞
IF %M%==1
非常不安全,因为输入几乎可以是任何东西,从字母数字字符到特殊字符。如果%M%
等于空格,则会发生以下情况:
IF ==1
命令处理器不明白这一点。
此外,如果输入是
1==1 format D: &&
这将格式化您的 D 驱动器。
退出脚本
GOTO EOF
应该是GOTO :EOF
的,因为:EOF
是一个预定义的标签,只能由GOTO :EOF
访问。否则,cmd 将跳转到未定义的 EOF 标签,从而导致错误。
虽然GOTO :EOF
有效,但我建议使用内部exit
命令。
EXIT
退出当前命令控制台。如果要在不关闭控制台的情况下退出子例程或其他脚本,则应改为尝试exit /b
。
隐藏@echo的命令输出
您可以考虑使用@echo off
而不是echo off
,因为 at 符号充当内联@echo off
。