Windows: Как указать многострочную команду в командной строке?

170

как продлить команду до следующей строки?

в основном, что альтернатива Windows для Linux

ls -l \
/usr/

здесь мы используем обратную косую черту для расширения команды на следующей строке

Что эквивалентно для Windows?

Jigar
источник
+1 для коротких и кратких вопросов и ответов, более расширенное исследование обработки
карет

Ответы:

297

Попробовав практически все клавиши на моей клавиатуре:

C:\Users\Tim>cd ^
Mehr? Desktop

C:\Users\Tim\Desktop>

Кажется, это ключ ^.

Timbo
источник
13
Microsoft не может соблюдать свои собственные стандарты, поэтому в PowerShell это не работает. Эквивалент PowerShell для ^ равен `So C: \ Users \ Tim> cd` >> Рабочий стол. Переносит вас на рабочий стол Тима \ 0 /
Ric Jafe,
3
@RicJafe Зачем это нужно? PowerShell полностью отделен! Эквивалентный ключ для PS - `.
WhatIsHeDoing
Любая идея о том, что это в PowerShell?
Райан
3
@RyanSeanWattrus Используя тот же самый научный метод: `(l'accent grave)
Timbo
57

В ^командной строке Windows используется для экранирования следующего символа в командной строке. (Like \используется в строках.) Символы, которые необходимо использовать в командной строке, должны иметь префикс ^ к ним, поэтому он работает для новой строки.

Для справки символы, которые необходимо экранировать (если они указаны в качестве аргументов команды, а не в кавычках): &|()

Таким образом, эквивалентом вашего примера Linux будет (« Больше?» - это приглашение):

C:\> dir ^
More? C:\Windows
Daemin
источник
15
Символ '^' должен быть последним символом в строке. В противном случае, если у вас есть пробел в конце, многострочная команда не работает.
Дмитрий Овдиенко
6

Символ каретки работает, однако следующая строка не должна начинаться с двойных кавычек. например, это не будет работать:

C:\ ^
"SampleText" ..

Начать следующую строку без двойных кавычек (недопустимый пример, просто для иллюстрации)

Али
источник
1

Если вы пришли сюда в поисках ответа на этот вопрос, но не совсем так, как имел в виду ОП, то есть как вы заставляете многострочную CMD работать в одной строке, у меня для вас есть опасный ответ.

Попытка использовать это с вещами, которые фактически используют трубопровод, как, скажем findstr, довольно проблематично. То же самое касается борьбы с elseс. Но если вы просто хотите, чтобы многострочная условная команда выполнялась непосредственно из CMD, а не через пакетный файл, это должно работать хорошо.

Допустим, у вас есть что-то вроде этого в пакете, который вы хотите запустить непосредственно в командной строке:

@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"
    )
)

Теперь вы можете использовать carat ( ^) для продолжения строки и вручную напечатать его, как это, но, предупреждающе, это утомительно, и если вы все испортите, вы можете научиться радости от того, что все это напечатаете снова.

Ну, это не сработает только ^благодаря тому, что экранирующие механизмы внутри скобок пожимают плечами. По крайней мере, не так, как написано. На самом деле вам нужно будет удвоить карат, например, так:

@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"))

Вместо этого вы можете быть грязным подлым сценаристом с неправильной стороны дорожек, который не нуждается в каратах, заменяя их на один pipe ( |) за продолжение цикла / выражения:

@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"
kayleeFrye_onDeck
источник