![我的 Windows DOS 设置似乎以我无法理解的方式损坏](https://linux22.com/image/1580220/%E6%88%91%E7%9A%84%20Windows%20DOS%20%E8%AE%BE%E7%BD%AE%E4%BC%BC%E4%B9%8E%E4%BB%A5%E6%88%91%E6%97%A0%E6%B3%95%E7%90%86%E8%A7%A3%E7%9A%84%E6%96%B9%E5%BC%8F%E6%8D%9F%E5%9D%8F.png)
我的 Windows DOS 设置似乎以我无法理解的方式损坏了:
CD 环境变量仅在cmd
使用选项/C
或启动时才有效/K
,同时如果我使用批处理(这是我的目标)或标准 cmd 页面,它不起作用。
除了此行为之外,我还遇到了命令问题start
:即使我的路径正确,文件也在那里,但每当我使用/max
或/wait
选项时,结果都是program.exe
找不到,同时如果我不使用任何参数,它就会正常启动。EGstart "" /d "C:\Program_1.0\" /max /wait "Program1.0.exe"
导致程序找不到。
什么可能导致这些问题?我快要疯了。
@ramhound 你在谈论PATH
变量,我在谈论!CD!
MS DOS 的变量。
例如:
@echo off
REM : ------------------------------------------------------------------
REM : main
chcp 1252
setlocal enabledelayedexpansion
@echo CURRENTDIR=!CD!
REM : parent directory of script
pushd "%~dp0" >NUL && set "WORKINGDIR="!CD!"" && popd >NUL
@echo WORKINGDIR=!WORKINGDIR!
pause
无论我使用什么位置启动该脚本,这里currentdir
都会workingdir
有相同的输出。
@DavidPostill:
谢谢,您说得对:从 Windows 资源管理器执行脚本时 - 或者如果您在控制台中启动批处理文件并导航到其父文件夹 - 脚本 DOS 不会更改工作目录。但系统从其他地方调用脚本时必须执行此操作(例如使用 %USERPROFILE% 下默认控制台中的完整路径)。这正是我遇到的第一个问题:对我来说并非如此。自己尝试一下,您将得到 CURRENTDIR = %USERPROFILE%,WORKINGDIR = 批处理文件的父文件夹。当使用 cmd /C 从 %USERPROFILE% 调用而不是直接从批处理文件调用时,它可以工作。这几乎看起来就像延迟扩展不起作用一样,但我不明白为什么。
答案1
无论我使用什么位置启动该脚本,这里currentdir
都会workingdir
有相同的输出。
你的脚本实际上并没有改变目录。因此,两个值相同也就不足为奇了。
您正在推送的%~dp0
是脚本的当前目录......
以下批处理文件演示了如果实际将目录更改为脚本的父目录会发生什么情况。
@echo off
setlocal enabledelayedexpansion
echo CURRENTDIR=!CD!
echo ~dp0=%~dp0%
rem save current directory, change to the parent directory, store the name of the parent directory
pushd "%~dp0" >NUL && cd .. && set "WORKINGDIR="!CD!"" && popd >NUL
echo WORKINGDIR=!WORKINGDIR!
echo CURRENTDIR=!CD!
pause
endlocal
笔记:
- 目录更改仅在
push
和pop
命令之间有效。 %WORKINGDIR%
现在有所不同,因为前面的内容cd ..
改变了当前目录。- CURRENTDIR 没有改变,因为它在
push
/poppairing and the current directory is restored by
popd之外使用
输出:
> test
CURRENTDIR=F:\test
~dp0=F:\test\
WORKINGDIR="F:\"
CURRENTDIR=F:\test
Press any key to continue . . .