Me gustaría tener un símbolo del sistema cmd, que asigne un directorio de red a una ruta local y luego agregue esa ruta local a la variable PATH (local).
He preparado este tipo de script .bat, que se ejecuta como se esperaba:
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%
Básicamente, este es el script que me gustaría ejecutar al inicio del nuevo cmd.exe
cuando ejecuto el .bat
archivo. El problema es que cuando se "monta" una ruta de red (por ejemplo, cuando pushd
se invoca), siempre obtiene una letra de unidad local nueva y diferente (X:, Y:, Z:...), así que tengo que detectar qué El equivalente de la ruta de la unidad local es (por ejemplo, a través de chdir
) antes de poder agregarlo a la RUTA para esa sesión; y además, me sorprende por qué SET PATH=%PATH%;%bvar%
siempre se duplica el punto y coma ;
antes de la parte adjunta, cuando el concatenado final PATH
es echo
ed.
Aprendí que el signo de porcentaje %
se escapa duplicándolo ( %%
); ese signo comercial &
es el separador para concatenar varias líneas de código en una sola línea, que se escapa con el símbolo de intercalación ^
, pero todavía estoy desconcertado porque las comillas dobles "
parecen terminar textualmente en cualquiera de las variables a través de SET o fuera de echo
; Además, el for
comando siempre parece ejecutarse (y no puedo escapar de él con un signo de intercalación), incluso si es parte de una declaración de variable SET.
Entonces, en última instancia, no puedo convertir este script en una sola línea, por lo que puedo usarlo como argumento para start.exe
comandos de inicio; Tenga en cuenta que no me gustaría tener dos archivos por lotes, me gustaría tener solo uno. Primero me gustaría almacenar este script en una variable, para poder repetirlo para depurarlo, y esto es lo lejos que llegué:
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: el nuevo cmd.exe comienza con:
'""' is not recognized as an internal or external command,
operable program or batch file.
Luego, %CD%
se refiere a laanteriordirectorio (desde donde se inició el script .bat), no al nuevo.
Ninguno de estos recupera el nuevo nombre de unidad/ruta cuando se ejecuta de esta manera, excepto tal vez for /f "usebackq" %%x in (`chdir`)
, que realmente no puedo capturar (puedo ver su resultado) y tampoco parece tan consistente (a veces parece que está vacío).
¿Cómo puedo hacer que mi primer script escape, para que pueda servir como una sola línea en el start
argumento de mi segundo script, para poder iniciar cmd.exe
la terminal según lo previsto?
Referencias:
- http://ss64.com/nt/syntax-esc.html
- https://stackoverflow.com/questions/9546324/adding-directory-to-path-environment-variable-in-windows
- ¿Puedes explorar una ruta UNC usando un entorno de línea de comando sin asignarla a una unidad de red?
- Archivo por lotes que ejecuta cmd.exe, un comando, y luego permanece abierto cuando se le solicita
- ¿Ejecutar múltiples comandos con 1 línea en la línea de comandos de Windows?
Respuesta1
Estás demasiado pensando en esto. Parece que los árboles no permiten ver el bosque ;-)
En primer lugar, "%~dp0"
proporciona la ubicación del script que se está ejecutando actualmente,noel directorio actual.
En segundo lugar, ya está utilizando %CD%
para imprimir el directorio actual al final. ¿Por qué no usarlo cuando extienda su RUTA?
@echo off
pushd "\\NetworkPath\Users\myname\Downloads"
path %path%;"%cd%"