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.exe
quando executo o .bat
arquivo. 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
é echo
editada.
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 for
comando 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.exe
comandos 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 start
argumento do meu segundo script, para que eu possa iniciar cmd.exe
o terminal conforme planejado?
Referências:
- http://ss64.com/nt/syntax-esc.html
- https://stackoverflow.com/questions/9546324/adding-directory-to-path-environment-variable-in-windows
- Você pode navegar em um caminho UNC usando um ambiente de linha de comando sem mapeá-lo para uma unidade de rede?
- Arquivo em lote que executa cmd.exe, um comando, e permanece aberto no prompt
- Executar vários comandos com 1 linha na linha de comando do Windows?
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%"