我想要一个 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%
总是加倍分号。;
PATH
echo
我了解到百分号%
是通过将其加倍(%%
)来转义的;&符号&
是将多行代码连接成一行的分隔符,用插入符号 进行转义^
,但我仍然感到困惑,因为双引号"
似乎要么通过 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%"