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

0

Eu gostaria de receber um prompt de comando cmd, que mapeia um diretório de rede para um caminho local e, em seguida, adiciona esse caminho local à variável PATH (local).

Eu preparei este tipo de script .bat, que é executado como 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 do novo cmd.exe quando eu executar o arquivo .bat . 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 eu tenho que detectar qual é o caminho equivalente da unidade local (por exemplo, via chdir ) antes de poder adicioná-lo ao PATH dessa sessão; e também estou confuso por que SET PATH=%PATH%;%bvar% sempre duplica o ponto-e-vírgula ; antes da parte anexada, quando o% concatenado finalPATH é echo ed.

Aprendi que o sinal de porcentagem % é evitado, dobrando-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 perplexo, pois as aspas duplas " parecem terminar textualmente em ambas as variáveis via SET ou fora de echo ; também o comando for sempre parece ser executado (e não consigo escapar dele com o cursor) - mesmo que seja parte de uma instrução de variável SET.

Portanto, em última análise, não consigo converter esse script em um único liner, portanto, posso usá-lo como um argumento para start.exe como comandos de inicialização; note que eu não gostaria de ter dois arquivos em lote, eu gostaria de ter apenas um. Eu gostaria de primeiro armazenar esse script em uma variável, para que eu possa fazer o eco para depuração - e isso é o quão longe eu 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 ao diretório anterior (do qual o script .bat foi iniciado), não ao novo.

Nenhum destes recupera o nome da nova unidade / caminho quando executado assim - exceto talvez for /f "usebackq" %%x in ('chdir') , que eu realmente não consigo capturar (eu posso ver sua saída), e não parece tão consistente (às vezes parece relata vazio).

Como faço para que meu primeiro script escape, para que ele sirva como um marcador no argumento start do segundo script, para que eu possa iniciar cmd.exe terminal como pretendido?

Referências:

por sdaau 26.09.2015 / 20:19

1 resposta

1

Você está pensando demais nisso. Você não consegue ver a floresta para as árvores;)

Primeiro, "%~dp0" indica a localização do seu script atualmente em execução, não o 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 quando você estende seu PATH!?

@echo off
pushd "\NetworkPath\Users\myname\Downloads"
path %path%;"%cd%"
    
por 27.09.2015 / 22:31