Комментирование нескольких строк в пакетном файле DOS
Я написал огромный пакетный файл MS DOS. Для тестирования этого пакетного файла мне нужно выполнить только некоторые строки и хотите скрыть/закомментировать оставшиеся.
У меня есть некоторые существующие строки комментариев, начинающиеся с :: Поэтому я не могу использовать :: как он будет бороться все комментарии.
любая помощь в этом отношении будет оценена по достоинству. Спасибо заранее, Джей
6 ответов:
Если вы хотите добавить REM в начале каждой строки вместо использования GOTO, вы можете использовать Notepad++ для этого легко выполните следующие действия:
- выберите блок строк
- нажмите Ctrl-Q
повторите шаги для раскомментирования
другой вариант-заключить нежелательные строки в блок IF, который никогда не может быть истинным
if 1==0 ( ... )
конечно, ничего в блоке if не будет выполнено, но он будет проанализирован. Таким образом, вы не можете иметь недопустимый синтаксис внутри. Кроме того, комментарий не может содержать
)
если он не экранируется или не цитируется. По этим причинам принятое решение GOTO является более надежным. (Решение GOTO также может быть быстрее)обновление 2017-09-19
здесь это косметическое повышение до pdub-х. Я определяю простую переменную среды "макрос", которая делает синтаксис комментариев GOTO немного лучше для самостоятельного документирования. Хотя обычно рекомендуется :метки уникальны в пакетном скрипте, действительно нормально вставлять несколько комментариев, подобных этому, в один и тот же пакетный скрипт.
@echo off setlocal set "beginComment=goto :endComment" %beginComment% Multi-line comment 1 goes here :endComment echo This code executes %beginComment% Multi-line comment 2 goes here :endComment echo Done
или вы можете использовать один из этих вариантов решение npocmaka. Использование РЗМ вместо перерыва делает намерение немного яснее.
rem.||( remarks go here ) rem^ ||( The space after the caret is critical )
break||( code that cannot contain non paired closing bracket )
в то время как
goto
решение-хороший вариант, он не будет работать в квадратные скобки (включая команды FOR и IF).Но это будет. Хотя вы должны быть осторожны с закрытием скобок и недопустимым синтаксисом дляFOR
иIF
команды, потому что они будут разобраны.обновление
обновление dbenham это ответ дал мне некоторые идеи. Во-первых-есть два разных случая, когда нам могут понадобиться многострочные комментарии - в контексте скобки, где GOTO нельзя использовать и вне его. Внутри контекста скобок мы можем использовать другие скобки, если есть условие, которое предотвращает выполнение кода.Хотя код thede все равно будет разбираться и некоторые синтаксические ошибки будут обнаружены (
FOR
,IF
, неправильно закрытые скобки, неправильное расширение параметра..). поэтому, если это возможно, лучше использовать GOTO.хотя это не возможно, чтобы создать макрос/переменная, используемая в качестве метки-но можно использовать макросы для комментариев скобок.Еще два трюка можно использовать сделать Гото комментарии более симметричные и более приятные (по крайней мере для меня). Для этого я использую два трюка -1) вы можете поместить один символ перед этикеткой и Гото все еще сможет чтобы найти его (я понятия не имею, почему это this.My guues он ищет диск). 2) вы можете поставить один
:
в конце имени переменной и функции замены / вычитания будет не срабатывает (даже при включенных расширениях). Который в сочетании с макросами для скобок комментариев может сделайте так, чтобы оба случая выглядели почти одинаково.Итак, вот примеры (в порядке, который мне нравится больше всего):
С прямоугольные скобки:
@echo off ::GOTO comment macro set "[:=goto :]%%" ::brackets comment macros set "[=rem/||(" & set "]=)" ::testing echo not commented 1 %[:% multi line comment outside of brackets %:]% echo not commented 2 %[:% second multi line comment outside of brackets %:]% ::GOTO macro cannot be used inside for for %%a in (first second) do ( echo first not commented line of the %%a execution %[% multi line comment %]% echo second not commented line of the %%a execution )
С фигурные скобки:
@echo off ::GOTO comment macro set "{:=goto :}%%" ::brackets comment macros set "{=rem/||(" & set "}=)" ::testing echo not commented 1 %{:% multi line comment outside of brackets %:}% echo not commented 2 %{:% second multi line comment outside of brackets %:}% ::GOTO macro cannot be used inside for loop for %%a in (first second) do ( echo first not commented line of the %%a execution %{% multi line comment %}% echo second not commented line of the %%a execution )
С скобки:
@echo off ::GOTO comment macro set "(:=goto :)%%" ::brackets comment macros set "(=rem/||(" & set ")=)" ::testing echo not commented 1 %(:% multi line comment outside of brackets %:)% echo not commented 2 %(:% second multi line comment outside of brackets %:)% ::GOTO macro cannot be used inside for loop for %%a in (first second) do ( echo first not commented line of the %%a execution %(% multi line comment %)% echo second not commented line of the %%a execution )
смесь powershell и C стили (
<
не может использоваться, потому что перенаправление с более высоким prio.*
не может быть использован из-за%*
):@echo off ::GOTO comment macro set "/#:=goto :#/%%" ::brackets comment macros set "/#=rem/||(" & set "#/=)" ::testing echo not commented 1 %/#:% multi line comment outside of brackets %:#/% echo not commented 2 %/#:% second multi line comment outside of brackets %:#/% ::GOTO macro cannot be used inside for loop for %%a in (first second) do ( echo first not commented line of the %%a execution %/#% multi line comment %#/% echo second not commented line of the %%a execution )
до акцент вот такой комментарий (думал он не такой уж и короткий):
@echo off ::GOTO comment macro set "REM{:=goto :}REM%%" ::brackets comment macros set "REM{=rem/||(" & set "}REM=)" ::testing echo not commented 1 %REM{:% multi line comment outside of brackets %:}REM% echo not commented 2 %REM{:% second multi line comment outside of brackets %:}REM% ::GOTO macro cannot be used inside for for %%a in (first second) do ( echo first not commented line of the %%a execution %REM{% multi line comment %}REM% echo second not commented line of the %%a execution )
@jeb
и после использования этого, stderr кажется недоступным
нет, попробуйте это:
@echo off 2>Nul 3>Nul 4>Nul ben ali mubarak 2>&1 gadeffi ..next ? echo hello Tunisia pause
но почему это работает?
извините, я отвечаю на вопрос по-французски:
( Ла-перенаправление пар 3> есть профиль spécial автомобиля Элль КР О ва л'utiliser залить рекордер из ЛЕ-пото-де erreurs 2> есть на Ва ле трансформаторов в организации потока персистирующая à л аде де 3> Кэси ва nous permettre d'avoir une gestion des erreur pour tout notre Environment de script..par la suite si on veux recuperer le flux 'stderr' il faut faire une autre redirection du handle 2 > au handle 1 > qui n'est autre que la console.. )