¿Cómo escribir un comando multilínea?
¿Cómo extendemos un comando a la siguiente línea?
Básicamente, ¿cuál es la alternativa de Windows para Linux?
ls -l \
/usr/
Aquí usamos barras invertidas para extender el comando a las siguientes líneas.
¿Cuál es el equivalente para Windows?
Después de probar casi todas las teclas de mi teclado:
C:\Users\Tim>cd ^
Mehr? Desktop
C:\Users\Tim\Desktop>
Entonces parece ser la clave ^.
Tenga en cuenta que ^
el seguimiento también funciona en archivos por lotes (probado en Windows 7).
En el símbolo del sistema de Windows, se ^
utiliza para escapar del siguiente carácter en la línea de comando. (Like \
se usa en cadenas). Los caracteres que deben usarse en la línea de comando tal como están deben tener un ^ prefijo, por eso funciona para la nueva línea.
Como referencia, los caracteres que necesitan escape (si se especifican como argumentos de comando y no entre comillas) son:&|()
Entonces, el equivalente de su ejemplo de Linux sería (¿ Más? siendo un mensaje):
C:\> dir ^
More? C:\Windows
Solución 1 En CMD, use ^
, ejemplo
docker run -dp 3000:3000 ^
-w /app -v "$(pwd):/app" ^
--network todo-app ^
-e MYSQL_HOST=mysql ^
-e MYSQL_USER=root ^
-e MYSQL_PASSWORD=secret ^
-e MYSQL_DB=todos ^
node:12-alpine ^
cmd "npm install && yarn run start"
Solución 2 En PowerShell, use ` (comilla invertida), ejemplo
docker run -dp 3000:3000 `
-w /app -v "$(pwd):/app" `
--network todo-app `
-e MYSQL_HOST=mysql `
-e MYSQL_USER=root `
-e MYSQL_PASSWORD=secret `
-e MYSQL_DB=todos `
node:12-alpine `
cmd "npm install && npm run start"
El carácter de intercalación funciona, sin embargo, la siguiente línea no debe comenzar con comillas dobles. por ejemplo, esto no funcionará:
C:\ ^
"SampleText" ..
Comience la siguiente línea sin comillas dobles (no es un ejemplo válido, solo para ilustrar)
Si vino aquí buscando una respuesta a esta pregunta pero no exactamente como quería decir el OP, es decir, cómo hacer que CMD multilínea funcione en una sola línea, tengo una especie de respuesta peligrosa para usted.
Intentar usar esto con cosas que realmente usan tuberías, como por ejemplo, findstr
es bastante problemático. Lo mismo se aplica al tratar con else
el s. Pero si solo desea que un comando condicional de varias líneas se ejecute directamente desde CMD y no a través de un archivo por lotes, esto debería funcionar bien.
Supongamos que tiene algo como esto en un lote que desea ejecutar directamente en el símbolo del sistema:
@echo off
for /r %%T IN (*.*) DO (
if /i "%%~xT"==".sln" (
echo "%%~T" is a normal SLN file, and not a .SLN.METAPROJ or .SLN.PROJ file
echo Dumping SLN file contents
type "%%~T"
)
)
Ahora, podrías usar el quilate de continuación de línea ( ^
) y escribirlo manualmente de esta manera, pero advertencia, es tedioso y si te equivocas, puedes aprender el placer de escribirlo todo nuevamente.
Bueno, no funcionará solo ^
gracias a los mecanismos de escape entre paréntesis . Al menos no como está escrito. En realidad, necesitarías duplicar los quilates de esta manera:
@echo off ^
More? for /r %T IN (*.sln) DO (^^
More? if /i "%~xT"==".sln" (^^
More? echo "%~T" is a normal SLN file, and not a .SLN.METAPROJ or .SLN.PROJ file^^
More? echo Dumping SLN file contents^^
More? type "%~T"))
En cambio, puedes ser un scripter sucio y astuto del lado equivocado de las pistas que no necesitan quilates cambiándolas por un solo tubo ( |
) por continuación de un bucle/expresión:
@echo off
for /r %T IN (*.sln) DO if /i "%~xT"==".sln" echo "%~T" is a normal SLN file, and not a .SLN.METAPROJ or .SLN.PROJ file | echo Dumping SLN file contents | type "%~T"