Windows cmd: comandos de escape para iniciar o cmd a partir do arquivo em lote, executando comandos que são adicionados ao PATH

Windows cmd: comandos de escape para iniciar o cmd a partir do arquivo em lote, executando comandos que são adicionados ao PATH

Gostaria de ter um prompt de comando cmd, que mapeie um diretório de rede para um caminho local e, em seguida, adicione esse caminho local à variável PATH (local).

Preparei este tipo de script .bat, que funciona conforme o esperado:

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%

Essencialmente, este é o script que gostaria de executar no início de um novo, cmd.exequando executo o .batarquivo. O problema é que quando um caminho de rede é "montado" (por exemplo, quando pushdé invocado), ele sempre recebe uma letra de unidade local nova e diferente (X:, Y:, Z: ...), então tenho que detectar o que é isso. O equivalente do caminho da unidade local é (por exemplo, via chdir) antes de poder adicioná-lo ao PATH para essa sessão; e também estou confuso por que SET PATH=%PATH%;%bvar%sempre dobra o ponto e vírgula ;antes da parte anexada, quando a concatenação final PATHé echoeditada.

Aprendi que o sinal de porcentagem %é escapado duplicando-o ( %%); esse e comercial &é o separador para concatenar várias linhas de código em uma única linha, que é escapada com caret ^, mas ainda estou confuso, pois aspas duplas "parecem acabar literalmente em variáveis ​​​​via SET ou fora de echo; além disso, o forcomando sempre parece ser executado (e não consigo escapar dele com acento circunflexo) - mesmo que faça parte de uma instrução de variável SET.

Então, no final das contas, não consigo converter esse script em uma linha, então posso usá-lo como argumento para start.execomandos de inicialização; observe que eu não gostaria de ter dois arquivos em lote, gostaria de ter apenas um. Gostaria primeiro de armazenar esse script em uma variável, para poder repeti-lo para depuração - e foi assim que cheguei:

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%"

Problema – o novo cmd.exe começa com:

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

Em seguida, %CD%refere-se aoanteriordiretório (a partir do qual o script .bat foi iniciado), não para o novo.

Nenhum deles recupera o novo nome da unidade/caminho quando executado assim - exceto talvez for /f "usebackq" %%x in (`chdir`), que não consigo capturar (posso ver sua saída) e também não parece tão consistente (às vezes parece que reporta vazio).

Como posso escapar do meu primeiro script, para que ele possa servir como uma linha no startargumento do meu segundo script, para que eu possa iniciar cmd.exeo terminal conforme planejado?

Referências:

Responder1

Você está pensando demais nisso. Parece que você não consegue ver a floresta por causa das árvores ;-)

Primeiro, "%~dp0"fornece a localização do script em execução no momento,nãoo diretório atual.

Em segundo lugar, você já está usando %CD%para imprimir o diretório atual no final - por que não usá-lo ao estender seu PATH!?

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

informação relacionada