Пакетный вывод файла без пути / каталога перед командами

#batch-file #directory #path #output

#пакетный файл #каталог #путь #вывод

Вопрос:

Итак, как сказано в названии, я хотел бы удалить каталог или путь, который помещается перед вызываемыми командами, если я вывожу пакетный файл в текстовый файл.

Например, у меня есть такой пакетный файл

 call :sub>log.txt
    
:sub
SET ip=127.0.0.1
ping %ip%
  

В качестве вывода я получаю следующее:

 C:Users...>SET ip=127.0.0.1     
C:Users...>ping 127.0.0.1 
pingoutput
  

Чего я хочу, так это:

 SET ip=127.0.0.1
ping 127.0.0.1
pingoutput
  

Путь впереди может стать довольно раздражающим для глубоких каталогов.
Приведенные выше примеры — это просто примеры. Я хочу создать пакетный файл для установки базы данных sql и различных триггеров и функций с помощью пакетного файла, чтобы я мог легко развернуть его на разных компьютерах.

Edit говорит: @echo off в начале просто полностью удаляет строку, даже саму команду.

Комментарии:

1. Префикс — это строка запроса окна консоли, которую можно изменить с помощью prompt команды . Вы могли бы использовать prompt $H , например, для получения пустой подсказки (фактически $H представляет символ пробела, но здесь это не имеет никакого эффекта, хотя он будет содержаться в файле при перенаправлении на такой), но я рекомендую не использовать пустую подсказку, потому что тогда консоль выглядит довольно запутанной…

2. Насколько мне известно $H , @aschipfl, я помню, что он создавал странные символы в выходном файле. Изменилось ли это в разных версиях Windows/cmd.exe/notepad.exe , Я не мог подтвердить, отсюда и причина, которую я использовал только $G в своем ответе. Возможно $_ , это обеспечит аналогичную вещь, за исключением того, что она, очевидно, будет включать дополнительную пустую строку.

3. Вы правы, @Compo, я просто поиграл и обнаружил (на моем компьютере с Windows 7), что prompt $H создает последовательность BS ПРОБЕЛ BS (я предполагаю, что это может быть предназначено для того, чтобы действительно очистить предыдущий символ на консоли, когда BS просто перемещается назад). Таким образом, единственные оставшиеся возможности для получения пустого текста приглашения находятся $M на локальном диске и $ с пустым pushd / popd buffer (оба с включенными расширениями команд), оба из которых не совсем полезны в отношении указанных ограничений / зависимостей…

Ответ №1:

Если ваша реальная проблема — глубокие пути, есть более простое решение, о котором вы, вероятно, не подумали. Измените prompt строку.

 @Prompt $G
Call :Sub 1> "log.txt"
@Prompt
GoTo :EOF

:Sub
Set "IP=127.0.0.1"
%__APPDIR__%ping.exe %IP%
  

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

В приведенном выше примере я использовал $G , потому что он по-прежнему отличает команды от вывода, но вы, очевидно, могли бы поиграть с ним, чтобы найти то, что вам больше нравится.

Чтобы узнать больше о доступных параметрах, откройте окно командной строки, введите prompt /? , нажмите ENTERклавишу и прочитайте представленную информацию.

Комментарии:

1. Вы также должны заметить, что в моем коде выше я включил GoTo :EOF инструкцию, которая не позволяет анализатору команд снова вернуться к метке. (При желании вы можете изменить это на другую фактическую метку или даже заменить ее на Exit /B )

Ответ №2:

@echo off отключает ввод команд echo . Это не совсем так. если вы хотите увидеть команду, то echo каждая команда while @echo off включена:

 @echo off
call :sub>log.txt
goto :eof
:sub
echo set ip=127.0.0.1 amp; SET ip=127.0.0.1
echo ping %ip% amp; ping %ip%
  

или, если вы не хотите использовать оператор `amp;, будут работать только новые строки:

 @echo off
call :sub>log.txt
goto :eof  
:sub
echo set ip=127.0.0.1
SET ip=127.0.0.1
echo ping %ip%
ping %ip%
  

и полностью без call указания метки:

 @echo off
(echo set ip=127.0.0.1 amp; set ip=127.0.0.1
echo ping %ip% amp; ping %ip%)>log.txt
  

Комментарии:

1. Просто небольшое уточнение, @echo off не отключает командный echo ввод, echo off отключает echo ввод для текущего cmd.exe экземпляра или до echo on тех пор, пока не включит его снова. @ Префикс отключает echo ввод команды, которая следует за ним, в этом случае он предотвращает редактирование команды echo off echo . Я чувствую, что это важное различие, потому что многие пользователи, похоже, думают, что есть @echo команда, когда ее нет.