Windows cmd:转义命令以从批处理文件启动 cmd,执行添加到 PATH 的命令

Windows cmd:转义命令以从批处理文件启动 cmd,执行添加到 PATH 的命令

我想要一个 cmd 命令提示符,它将网络目录映射到本地路径,然后将该本地路径添加到(本地)PATH 变量。

我准备了这种.bat脚本,可以按预期运行:

pushd \\NetworkPath\Users\myname\Downloads
chdir
SET CurrentDir="%~dp0"
SET var=%cd% & SET CDIR=`chdir`
for /f "usebackq" %%x in (`chdir`) do set bvar=%%x
SET PATH=%PATH%;%bvar%
@echo IT IS: %CurrentDir%, %var%, %CDIR%, %bvar% ;;; %PATH% ---  %CD%

cmd.exe本质上,这是我在运行文件时想要在 new 开始时运行的脚本.bat。问题是,当网络路径被“挂载”时(例如,当pushd调用时),它总是会获得一个新的不同的本地驱动器号(X:、Y:、Z:...),所以我必须先检测这个本地驱动器路径等效项是什么(例如 via chdir),然后才能将其添加到该会话的 PATH;而且,我很困惑为什么在最后的连接被编辑时,附加部分之前SET PATH=%PATH%;%bvar%总是加倍分号。;PATHecho

我了解到百分号%是通过将其加倍(%%)来转义的;&符号&是将多行代码连接成一行的分隔符,用插入符号 进行转义^,但我仍然感到困惑,因为双引号"似乎要么通过 SET 逐字逐句地出现在变量中,要么在 之外echo;此外,该for命令似乎总是执行(我无法用插入符号对其进行转义) - 即使它是 SET 变量语句的一部分。

所以最终,我无法将此脚本转换为单行代码,因此我可以将其用作start.exe启动命令的参数;请注意,我不希望有两个批处理文件,我只想有一个。我想先将此脚本存储在一个变量中,这样我就可以将其回显以进行调试 - 这就是我所取得的进展:

SET TCMD="" pushd \\NetworkPath\Users\myname\Downloads ^& chdir ^& SET CurrentDir="%%~dp0" ^& SET var=^%%cd^%% ^& SET CDIR=^(`chdir`) ^& SET PATH=%%PATH%%;%%CD%% ^& echo %%CurrentDir%%, %%var%%, %%CDIR%%, %%bvar%% ;;; %%PATH%% ---  %%CD%% ""
echo %TCMD%
start cmd.exe /k "%TCMD%"

问题-新的 cmd.exe 以以下内容开头:

'""' is not recognized as an internal or external command,
operable program or batch file.

然后,%CD%指的是以前的目录(.bat 脚本启动的目录),而不是新目录。

当像这样运行时,这些都不会检索新的驱动器/路径名称 - 除了可能for /f "usebackq" %%x in (`chdir`),我无法真正捕获(我可以看到它的输出),并且似乎也不那么一致(有时它似乎报告为空)。

我怎样才能使我的第一个脚本转义,以便它可以作为我的第二个脚本的参数中的单行脚本start,以便我可以cmd.exe按预期启动终端?

参考:

答案1

你想得太多了。你似乎只见树木不见森林 ;-)

首先,"%~dp0"给出当前正在执行的脚本的位置,不是当前目录。

其次,您已经在使用它%CD%在最后打印出当前目录 - 为什么不在扩展 PATH 时使用它呢?

@echo off
pushd "\\NetworkPath\Users\myname\Downloads"
path %path%;"%cd%"

相关内容