batch-file - 批处理文件启动器(批量)未正确评估路径
问题描述
任务
我正在尝试为 Program Files (x86) 文件夹中的(几乎)所有批处理程序制作一个启动器(批量)。我还需要它与任何人的 Windows 10 机器兼容。
问题
cd 命令无法正确评估路径。它只是说The directory name is invalid.
代码
@echo off
color 02
cls
cd "%~dp0batchfile.bat"
start /max /realtime %cd%
exit
调试
我已经移动了文件,调整了代码,甚至放置了原始路径,这一切都奏效了!但它仍然给出错误并导致程序出现故障。我担心它会对某人的计算机和其他人的计算机造成损坏。(对于批处理大声笑来说太复杂了)我也尝试过回显之前的 cd、它应该设置的路径以及之后的 cd。之前的 cd 和要设置的内容很好,但它仍然说The directory name is invalid.
And "doesn't" get set。这是我尝试过的代码:
@echo off
color 02
cls
cd "%~dp0batchfile.bat"
rem Debug:
echo %cd%
pause
rem real code:
start /max /realtime %cd%
exit
没关系。它给出了错误,但它可以不间断地工作,并减少滞后和故障。我不知道为什么,因为对于我的 smol phatt 大脑来说,这甚至是不可能的。祝福你。也许这只是微软需要修复的一个错误,但不管它是什么,它都很烦人,它破坏了我(几乎)所有批处理程序的清洁度。
结论 (你做的)
你想:在 StackOverflow 上提问时,这个笨蛋甚至不知道从哪里开始。
我正在阅读您的想法:这是我在 StackOverflow 上提出的第一个问题。所以是的,我的意思是不,不,是的,等等等等,不,我不知道从哪里开始。什么?祝福你。哎呀再次祝福你。
解决方案
batchfile.bat
是FILE而不是目录。因此无法将当前目录更改为file batchfile.bat
。
一种解决方案是cd /D "%~dp0"
将当前目录更改为包含当前执行的批处理文件的目录。只要批处理文件存储在分配了驱动器号的存储介质上,此方法就可以工作。所以代码是:
@echo off
cd /D "%~dp0"
color 02
cls
start "Window Title" /MAX "FileName.exe"
color
但是批处理文件也可以存储在使用UNC路径启动的网络资源上。默认情况下, Windows 命令处理器cmd.exe
不允许将网络资源路径设置为当前目录。对于此类用例,需要以下代码。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
pushd "%~dp0" || goto :EOF
color 02
cls
start "Window Title" /MAX "FileName.exe"
color
popd
但是启动器批处理文件不应将其自身的目录设为当前目录,而是将要启动的批处理文件的目录作为第一个参数传递给启动器批处理文件。因此,其他批处理文件的启动器批处理文件可能是:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
if "%~1" == "" (
color 02
cls
echo INFO: "%~nx0" must be started with a batch file name.
echo/
pause
color
) else start "%~n1" /MAX %SystemRoot%\System32\cmd.exe /C "pushd "%~dp1" && (color 02 & cls & "%~nx1" & popd)"
endlocal
不要使用命令exit
退出cmd.exe
独立于调用层次结构。这在此处不是必需的,只会使在命令提示符窗口中执行批处理文件时更难调试它。
不要使用/REALTIME
命令START的选项,因为此进程优先级主要用于驱动程序,绝不能用于其他可执行文件,绝对不能用于由cmd.exe
.
要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
call /?
解释:
%~dp0
... 参数 0 的驱动器和路径,完整的批处理文件路径始终以反斜杠结尾,
%~1
... 第一个参数删除了周围的双引号,
%~n1
... 第一个参数的文件名,
%~dp1
... 驱动器和路径第一个参数,
%~nx1
...文件名和第一个参数的扩展名。cd /?
cls /?
cmd /?
color /?
echo /?
endlocal /?
goto /?
if /?
pause /?
popd /?
pushd /?
setlocal /?
start /?
推荐阅读
- python - 减少 Paramiko 最大请求大小
- c++ - 内联函数和前向引用
- python - python 3:如何在不添加新键和值的情况下通过新变量重新排列列表中的字典
- ios - 当我没有 UIViewController 时如何链接 viewDidLoad
- reactjs - 组件挂载前如何获取数据?
- count - 在 Power BI 中按两列分组并将重复数计为 1
- sql - If/Else 语句中的 Golang Postgres 语法错误
- python-3.x - 如何在 Python 中找到一个句子中的整个单词?
- html - 我应该有不同版本的段落吗
- docker - 使用 boltdb 作为存储的 Grafana loki 备份