как запустить две команды в одной строке в windows cmd?

<p>я хочу выполнить две команды в консоли windows cmd.</p><p>в linux я бы сделал это так</p><pre><code>touch thisfile ; ls -lstrh </code></pre><p>как это делается в windows?</p>

<p>вот так на всех ос microsoft с 2000 года и до сих пор хорош:</p><pre><code>dir & echo foo </code></pre><p>если вы хотите, чтобы вторая команда выполнялась только в случае успешного завершения первой команды:</p><pre><code>dir && echo foo </code></pre><p>синтаксис с одним амперсандом (&) для выполнения нескольких команд в одной строке восходит к windows xp, windows 2000 и некоторым более ранним версиям nt. (по крайней мере, 4.0, согласно одному комментатору здесь.)</p><p>есть немало других моментов, которые вы найдете, прокручивая эту страницу.</p><p>исторические данные следует, для тех, кто может найти его образовательным.</p><p>до этого синтаксис && был только функцией замены shell 4dos до того, как эта функция была добавлена в интерпретатор команд microsoft.</p><p>в windows 95, 98 и me вы бы вместо этого использовали символ канала:</p><pre><code>dir | echo foo </code></pre><p>в ms-dos 5.0 и более поздних версиях, в некоторых более ранних версиях интерпретатора команд для windows и nt, (недокументированным) разделителем команд был символ 20 (ctrl + t), который я буду обозначать здесь ^ t.</p><pre><code>dir ^t echo foo </code></pre>

<p>цитата из документации:</p><ul> <li>источник: microsoft, windows xp professional документация по продукту, <a href="https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490954(v=technet.10)"><em>обзор командной оболочки</em></a> </li> </ul><blockquote> <p><em>использование нескольких команд и условных символов обработки</em></p> <p>вы можете запустить несколько команд из одной командной строки или скрипта, используя условные символы обработки. при запуске нескольких команд с символами условной обработки команды справа от символа условной обработки действуют на основе результатов команды слева от символа условной обработки. </p> <p>например, вы можете выполнить команду только в случае сбоя предыдущей команды. или вы можете запустить команду, только если предыдущая команда была успешной.</p> <p>вы можете использовать специальные символы, перечисленные в следующей таблице, для передачи нескольких команд.</p> <ul> <li><p><code>& [...]</code><br> <code>command1 & command2</code><br> используется для разделения нескольких команд в одной командной строке. cmd.exe запускает первую команду, а затем вторую команду.</p></li> <li><p><code>&& [...]</code><br> <code>command1 && command2</code><br> используйте для запуска команды, следующей за &&, только если команда, предшествующая символу, успешна. cmd.exe запускает первую команду, а затем запускает вторую команду, только если первая команда выполнена успешно. </p></li> <li><p><code>|| [...]</code><br> <code>command1 || command2</code><br> используйте для запуска команды, следующей за || только если команда предшествует || выходит из строя. cmd.exe запускает первую команду, а затем запускает вторую команду только в том случае, если первая команда не выполнена успешно (получает код ошибки больше нуля).</p></li> <li><p><code>( ) [...]</code><br> <code>(command1 & command2)</code><br> используйте для группировки или вложения нескольких команд.</p></li> <li><p><code>; or ,</code><br> <code>command1 parameter1;parameter2</code><br> используйте для разделения параметров команды.</p></li> </ul> </blockquote>

<p><code>&</code> является эквивалентом bash для <code>;</code> (команды запуска), а <code>&&</code> является эквивалентом bash <code>&&</code> (команды запускаются только в том случае, если предыдущий код не вызвал ошибку).</p>

<p>вы можете использовать & для запуска команд одна за другой. пример: <code>c:\dir & vim myfile.txt</code></p>

<p>если вы хотите создать ярлык cmd (например, на рабочем столе), добавьте параметр/k (/ k означает сохранить,/c закроет окно):</p><pre><code>cmd /k echo hello && cd c:\ && cd windows </code></pre>

<p>вы можете использовать<em> call </em>, чтобы преодолеть проблему оценки переменных среды слишком рано - например,.</p><pre><code>set a=hello & call echo %a% </code></pre>

<p>ряд <a href="http://ss64.com/nt/syntax-redirection.html">символов обработки</a> может использоваться при выполнении нескольких команд в одной строке, и в некоторых случаях может привести к перенаправлению обработки, изменению вывода в другом случае или просто к ошибке. одним из важных случаев является размещение на одной строке команд, которые манипулируют переменными.</p><pre><code>@echo off setlocal enabledelayedexpansion set count=0 set "count=1" & echo %count% !count! 0 1 </code></pre><p>как видно из приведенного выше примера, когда команды, использующие переменные, размещаются в одной строке, вы должны использовать отложенное расширение для обновления значений переменных. если ваша переменная проиндексирована, используйте команду call с %% модификаторами, чтобы обновить ее значение в той же строке:</p><pre><code>set "i=5" & set "arg!i!=myfile!i!" & call echo path!i!=%temp%\%%arg!i!%% path5=c:\users\username\appdata\local\temp\myfile5 </code></pre>

<p>итак, я пытался включить конкретную задачу запуска <code>regasm</code> (зарегистрировать сборку) из контекстного меню. проблема, с которой я столкнулся, заключалась в том, что результат вспыхнет и исчезнет, прежде чем я смог его прочитать. поэтому я попытался передать по трубопроводу в <code>pause</code>, который не работает при сбое команды (как упоминалось здесь <a href="https://stackoverflow.com/questions/9882019/pause-command-not-working-in-bat-script">команда pause не работает в сценарии .bat</a> а здесь <a href="https://stackoverflow.com/questions/4666045/batch-file-command-pause-does-not-work">команда пакетного файла pause не работает</a> ). поэтому я попробовал <code>cmd /k</code>, но это оставляет окно открытым для большего количества команд (я просто хочу прочитать результат). поэтому я добавил <code>pause</code>, а затем <code>exit</code> в цепочку, что привело к следующему:</p><p><code>cmd /k c:\windows\microsoft.net\framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit</code></p><p>это работает как чудо - regasm запускает файл и показывает его результаты, затем отображается приглашение «нажмите любую клавишу для продолжения ...», затем окно командной строки закрывается при нажатии клавиши.</p><p>постскриптум для других, кто может быть заинтересован, вы можете использовать следующие записи файла .reg, чтобы добавить ассоциацию dllfile к файлам .dll, а затем расширение команды regasm для этого (обратите внимание на экранированные кавычки и обратные слэши):</p><pre><code>[hkey\_classes\_root\.dll] "content type"="application/x-msdownload" @="dllfile" [hkey\_classes\_root\dllfile] @="application extension" [hkey\_classes\_root\dllfile\shell\regasm] @="register assembly" [hkey\_classes\_root\dllfile\shell\regasm\command] @="cmd /k c:\\windows\\microsoft.net\\framework\\v4.0.30319\\regasm.exe \"%1\" /codebase \"%1\" & pause & exit" </code></pre><p>теперь у меня есть красивое контекстное меню для регистрации сборки.</p>

<p><code>cmd /c ipconfig /all & output.txt</code></p><p>эта команда выполняет команду и открывает файл <code>output.txt</code> в одной команде</p>

<p>чтобы выполнить две команды одновременно, вы должны поместить символ & (амперсанд) между двумя командами. вот так:</p><pre><code>color 0a & start chrome.exe </code></pre><p>ура!</p>

<p>я пытаюсь иметь два пинга в одном окне, и это последовательная команда в одной строке. после окончания первого запуска второй команды.</p><p>решением было объединить с <code>start /b</code> в командной строке windows 7.</p><p>начните как обычно, без <code>/b</code> и запустите в отдельном окне.</p><p>команда, используемая для запуска в той же строке:</p><pre><code>start /b command1 parameters & command2 parameters </code></pre><p>в любом случае, если вы хотите проанализировать вывод, я не рекомендую использовать это ... я заметил, что вывод закодирован между выводами команд.</p>

<p>ну, у вас есть два варианта: трубопровод или просто <code>&</code>:</p><pre><code>dir /s & start file.txt </code></pre><p>или же,</p><pre><code>tasklist | find "notepad.exe" </code></pre><p>трубопровод (<code>|</code>) больше подходит для получения выходных данных одной команды и помещения их в другую. и (<code>&</code>) просто говорит запустить это, и это. </p>

<p>нет, <code>cd / && tree && echo %time%</code>. время отголоска - это время, когда выполняется первая команда.</p><p>у трубопровода есть некоторая проблема, но это не критично, пока люди знают, как это работает.</p>

<p>когда вы пытаетесь использовать или манипулировать переменными в одной строке, остерегайтесь их содержимого! например. переменная, подобная следующей</p><blockquote> <pre><code>path=c:\program files (x86)\somewhere;"c:\company\cool tool";%userprofile%\appdata\local\microsoft\windowsapps; </code></pre> </blockquote><p>может привести к множеству необратимых проблем, если вы используете его как <code>%path%</code></p><ol> <li>закрывающие круглые скобки завершают оператор группы</li> <li>двойные кавычки не позволяют использовать <code>%path%</code> для решения проблемы с круглыми скобками</li> <li>и что будет содержать ссылочная переменная, такая как <code>%userprofile%</code>?</li> </ol>

<p>еще один пример: например, когда мы используем систему сборки <code>gulp</code> вместо</p><p><code>gulp</code> - по умолчанию> build</p><p><code>gulp build</code> - build build-folder</p><p><code>gulp watch</code> - запустить просмотр файла</p><p><code>gulp dist</code> - построить dist-folder</p><p>мы можем сделать это одной строкой:</p><pre><code>cd c:\xampp\htdocs\project & gulp & gulp watch </code></pre>

<p>да, есть. это &.</p><p>&& выполнит команду 2, когда команда 1 будет выполнена, при условии, что она не завершилась.</p><p>& будет выполняться независимо.</p>

<p><strong> это просто: </strong>просто дифференцируйте их с помощью символов &&. пример: </p><pre><code>echo hello world && echo goodbye world </code></pre><p><em>goodbye world будет напечатан после hello world.</em></p>