Как запросить данные в bat файле
Устанавливаем переменную answer в пустое значение (необходимо, для того чтобы затереть предыдущее значение, например, если батник исполняется несколько раз). set с ключом /p устанавливает значение переменной, которое вводится пользователем. Проверяем значение переменной и если оно не равно y завершаем выполнение батника.
Как получить текущий месяц, день, год и т.п.?
В батниках есть возможность получать подстроку используя синтаксис %variable:
m,n% Где variable это название переменной m – индекс первого символа, а n – количество символов подстроки.
Следовательно, если команда echo %date% (а формат даты может у вас отличатся) выведет 13.06.2009, то для того чтобы получить текущий месяц достаточно выполнить %date:
3,2% Таким образом, если нам необходимо, например, сформировать имя файла или директории, которое соответствует текущему месяцу и дню, мы это сделаем так:
Лично мне такое понадобилось для задания ключа /d для xcopy.
Как вывести пустую строку в лог-файл?
Я не сразу догадался, что это можно делать вот так: :)
Т.е. нужно поставить точку после echo.
Предыдущая команда выполнена успешно?
В большинстве случаев это:
Архивирование файла с переменным именем
Задача состоит в том, чтобы заархивировать файл с именем, которое меняется ежедневно, но в другую папку. Следующим куском кода
мы выбираем все файлы по маске, исполняя команду rar a -ep c:\other_dir\%%
ni.rar %%i для каждого, где %%
ni это только имя файла.
Имя текущего исполняемого батника
Нужно, например, для того чтобы вести один лог для нескольких батников.
«Функция» в батниках
Если мы исполняем в одном батнике несколько повторяющихся команд, но с разными значениями переменных, то это можно реализовать так:
Таким образом, у меня отсылается десяток разных файлов разным получателям, используя The Bat! Такой файл читать и редактировать намного удобнее, чем это было бы десять команд The Bat! подряд.
Получить последний по дате создание файл
Для начала получим список всех файлов, отсортированных по дате модификации:
И пройдемся по нему циклом.
Логично, что по завершению цикла в переменной %lastfile% у нас будет последний по дате модификации файл ;)
Выкачать файл по FTP
Где файл file_to_ftp.txt будет у нас выглядеть следующим образом:
Создаем нумерованные каталоги с инкрементом на единицу
Разобраться в коде предлагаю вам самим. :) Основная возможность, которую я хотел показать данным примером, это использование ключа /a команды set для вычисления выражений. ;)
В любом случае, если пользователь вводит y или n, он всегда работает в режиме-dev.
Как заставить его работать в режиме dev, если ответ-да, и в обычном режиме, если ответ-нет. Кроме того, как я могу заставить его спросить снова, если входные данные не Y, N, y или n?
Если входные данные, скажем, N , ваши строки IF оцениваются следующим образом:
То есть вы сравниваете N с "y" , затем "n" и т. д. в том числе "N" . Вы никогда не получите совпадение, если пользователь каким-то образом не решит ввести "N" или "y" (то есть любой из четырех символов, но заключенный в двойные кавычки).Так что вам нужно либо удалить " со всего y , n , Y и N или поместите их вокруг %INPUT% в ваших условных утверждениях. Я бы рекомендовал последнее, потому что таким образом вы бы экранировали по крайней мере некоторые символы, которые имеют особое значение в пакетных сценариях (если пользователю удалось их ввести). Итак, вот что вы должны получить:
Кстати, вы можете уменьшить число условий, применив переключатель /I к оператору IF , например:
Переключатель /I делает сравнение нечувствительным к регистру, и поэтому вам не нужны отдельные проверки для строк с разными регистрами.
Один другая проблема заключается в том, что после выполнения команды режима разработки нет возможности перепрыгнуть через другую команду, и поэтому, если пользователь соглашается запустить Java в режиме разработки, он получит ее запуск как в режиме разработки, так и в режиме без разработки. Поэтому, возможно, вам нужно добавить что-то вроде этого в свой скрипт:
Наконец, чтобы решить проблему обработки неверных входных данных, вы можете просто добавить другую (безусловную) команду goto сразу после условных операторов, просто перед меткой yes , а именно goto Ask , чтобы вернуться к началу вашего скрипта, где отображается приглашение и запрашивается ввод, или вы могли бы также добавить другую команду ECHO перед прыжком, объясняя, что ввод был неправильным, что-то вроде этого:
Примечание: некоторые из упомянутых здесь вопросов также были рассмотрены @xmjx в своем ответе, который я полностью признаю.
Этот код я использую регулярно. Я заметил в примерах в этом блоге, что используются цитаты. Если строка теста изменена на использование кавычек, то тест недействителен.
Я протестировал на XP, Vista, Win7 и Win8. Все они терпят неудачу, когда используются кавычки.
Я не знаю, на какой платформе вы это делаете, но я предполагаю, что Windows из-за этого .расширение летучей мыши.
Также у меня нет способа проверить это, но это похоже на то, что пакетный процессор пропускает строки If из-за некоторых ошибок, а затем выполняет один с-dev.
Вы можете попробовать это, выбрав две цели прыжка ( :yes и :no ) вместе с кодом. Если затем выполняется строка без-dev, вы знаете, что ваши строки If ошибочны.
Если это так, пожалуйста, проверьте, действительно ли == правильный способ сделать сравнение в файлах .bat .
Также, судя по тому, как bash делает это, %foo=="y" может быть оценено как true, только если %foo включает кавычки. Так что, возможно, "%foo"=="y" - это путь.
В зависимости от версии Windows вы можете счесть использование опции "выбор" полезным. Насколько я могу судить, он не поддерживается в большинстве, если не во всех версиях x64. Удобная замена под названием Выбор.vbs вместе с примерами использования можно найти на SourceForge под названием Choice.zip
Добавьте кавычки ( "" ) вокруг % INPUT%, чтобы это выглядело следующим образом:
Хочу сделать bat файл, который выполняется только после ввода пароля. Как организовать это - не знаю.
Вот, что получилось.
@echo off
set /P var="Введите пароль: "
if var==565355 .
.
Конфигурация компьютера | |
Процессор: Intel Core i5-4570, 3200 MHz | |
Материнская плата: Asus Z97-K | |
Память: 2 x 8Gb DDR3-1333 Corsair Vengeance LP CML16GX3M2A1600C9 | |
HDD: Samsung SSD 850 PRO 256G (238Gb), WDC WD1001FALS (1Tb, 7200 RPM, SATA-II), WDC WD10EFRX (1Tb, SATA-III) | |
Видеокарта: MSI N750Ti (MS-V310) | |
Звук: Realtek ALC887 | |
Блок питания: Chieftec GPS-650AB 650W | |
CD/DVD: HL-DT-ST DVDRAM GSA-4167B | |
Монитор: 24" Philips 240PW9ES | |
ОС: Windows 7 Ultimate x64 SP1 | |
Индекс производительности Windows: 7.6 |
Последний раз редактировалось El Sanchez, 06-01-2011 в 21:15 . Причина: исправление
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
Конфигурация компьютера | |
Процессор: Intel Core i5-4570, 3200 MHz | |
Материнская плата: Asus Z97-K | |
Память: 2 x 8Gb DDR3-1333 Corsair Vengeance LP CML16GX3M2A1600C9 | |
HDD: Samsung SSD 850 PRO 256G (238Gb), WDC WD1001FALS (1Tb, 7200 RPM, SATA-II), WDC WD10EFRX (1Tb, SATA-III) | |
Видеокарта: MSI N750Ti (MS-V310) | |
Звук: Realtek ALC887 | |
Блок питания: Chieftec GPS-650AB 650W | |
CD/DVD: HL-DT-ST DVDRAM GSA-4167B | |
Монитор: 24" Philips 240PW9ES | |
ОС: Windows 7 Ultimate x64 SP1 | |
Индекс производительности Windows: 7.6 |
Держать пароль в открытом виде в батнике - нехорошо. Можно немного затруднить чтение пароля, например так:
можно создать еще один батник с проверкой пароля, скомпилировать его в .exe и вызывать, а ответ (верный\неверный) передавать через ErrorCode. Но это все примитивная защита, рассчитанная на офисных работников, который батник второй раз в жизни видят. Если он будет использоваться для чего-то серьезного - запрос пароля не спасет.может кому пригодиться.
при использовании данных команд внутри оператора IF следует (т.е. IF в IF, проверка в проверке):
1) в самом начале файла указать строку
Setlocal EnableDelayedExpansion
У меня есть файл Windows .bat, который я хотел бы принять от пользователя, а затем использовать результаты этого ввода как часть вызова дополнительных команд.
Например, я хотел бы принять идентификатор процесса от пользователя, а затем запустить jstack для этого идентификатора, поместив результаты вызова jstack в файл. Однако, когда я пытаюсь это сделать, это не работает.
Вот мой пример содержимого файла bat:
и вот что появляется в jstack.txt:
"Завершить пакетное задание (Да / Нет)?" обычно появляется, когда вы нажимаете Ctrl-C во время работы вашего .bat. Jstack.txt будет содержать выходные данные jstack и ничего, касающееся вашего пакетного файла, а также вы не сказали, что такое Jstack. Если вы хотите , фиксированные параметры для входа вы лучше использовать , choice чем set /p Пожалуйста, пометьте мой пост как ответ, суть которого заключается в том, что при запуске пакетной программы вы нажимаете Enter, а не вводите идентификатор в приглашении, и поэтому для% id% было задано значение, Enter ID: а не какой-то идентификатор, который вы должны были предоставить клавиатура.Попробуй это:
Затем вы можете использовать %id% в качестве параметра для другого командного файла, как jstack %id% .
Например:
Есть ли способ передать вывод команды SET в NIL:, чтобы вы могли скрыть ввод? Например, если вы хотите сделать: set /p ID:\r\n set /p pw=Enter Passwd: и не хотите, чтобы текст пароля отображался в окне, не говоря уже о том, чтобы отображаться в буфере команд «DosKey»? Я пробовал несколько разных способов, и не смог найти способ сделать это, кроме написания маленькой C-программы, которая бы взяла ввод и присвоила его EnvVar, но это обман! :) Я хочу, чтобы он работал только с CMD Windows. Обратите внимание на добавленную тонкость пространства в конце "Enter ID: " . Дает небольшой промежуток между подсказкой и ответом пользователя. Delete the internet?No silly против Delete the internet? No silly . Нет необходимости в цитатах. Чего не хватало @Instantsoup, так это «% id%» в строке jstack %id% > jstack.txtСинтаксис таков: set /p variable=[string]
После того, как вы установили свою переменную, вы можете использовать ее следующим образом.
обратите внимание на %VariableName% синтаксис
Пожалуйста, закончите предложение . Вы собираетесь включить другую ссылку? Кроме того, я протестировал все вышеперечисленное в cmd.exe оболочке Windows 7 , и каждый - без исключения - назначает пользовательский ввод для переменной с произвольным именем. Как ваш ответ украшает то, что уже было предоставлено? Зачем нам пространство? Что именно происходит в том, cmd что не позволяет места?Я не уверен, так ли это для всех версий Windows, однако на машине с XP у меня должно быть следующее:
Без строки подсказки в кавычках я получаю различные результаты в зависимости от текста.
+1 за «различные результаты в зависимости от текста»: у меня была та же проблема. Теперь он печатает цитаты с текстом, но странного поведения больше нет. используйте этот синтаксис, чтобы получить кавычки, но не показывайте их: set /p "var1=Prompt String" Полезно использовать кавычки и включать пробел в конце, поскольку это делает запрос в командной строке приятнее. Наличие кавычек делает очевидным, что в командном файле есть место. set /p Var1="Prompt String " Затем, когда вы запускаете файл и пользователь вводит что-то, что вы получаете Prompt String Yes вместо Prompt StringYesПространство после = очень важно.
если я получу то, что вы хотите, это прекрасно работает. Вы также можете использовать% input% в других командах.
:start это просто маркер . Например, он может также использовать a :end , который вызывает такие вещи, как очистка переменной, или вызов popd , или что-то в этом роде. Кроме того, у вас также есть возможность использовать IF ERRORLEVEL1 GOTO END . или даже a GOTO ERR , и в нем :err есть что-то вроде эха. Произошла ошибка при попытке получить номер файла. goto: end Это, вероятно, вопрос привычки .Для SETX нет задокументированного параметра / параметра приглашения, как для SET.
Если вам нужно запросить переменную окружения, которая выживет после перезагрузки, вы можете использовать SETX для ее хранения.
Переменная, созданная SETX, не будет использоваться, пока вы не перезапустите командную строку. Тем не менее, вы можете установить SETX для переменной, которая уже была SET, даже если она имеет то же имя.
Это работает для меня в Windows 8.1 Pro:
(Кавычки вокруг существующей переменной необходимы.)
Эта процедура позволяет вам использовать временную переменную, созданную SET, во время текущего сеанса и позволит вам повторно использовать переменную, созданную SETX, после перезагрузки компьютера или перезапуска приглашения CMD.
(Отредактировано для правильного форматирования абзацев кода.)
У меня есть маленький cmd, который я использую при подготовке компьютера к клиентам: он вызывает пользователя для ввода и переименовывает компьютер в него.
Привет еще раз! Этот полезный скрипт используется на ПК с Win10 после начальной настройки :-)Есть две возможности.
Вы забыли поставить %id% в jstack вызове.
Таким образом, весь правильный пакетный файл должен быть:
И / или 2. Вы поместили его в код (и забыли сообщить нам вопрос), но когда вы запустили пакетный файл, вы нажали клавишу Enter вместо ввода идентификатора (скажем, 1234).
То, что происходит, является результатом этих двух ошибок: jstack предполагается, что он вызывается с идентификатором, который вы ему предоставили.
Но в вашем случае (в соответствии с кодом, который вы указали в вопросе) вы назвали его без какой-либо переменной. Вы написали:
Поэтому, когда вы работаете jstack без переменных, выдается следующее:
Ваша вторая ошибка состоит в том, что вы нажали Enter вместо того значения , когда программа спрашивает вас: Enter ID: . Если бы вы в этот момент ввели идентификатор, скажем, 1234, %id% переменная стала бы этим значением, в нашем случае 1234. Но вы НЕ указали значение и вместо этого нажали Enter. Когда вы не даете переменной никакого значения, и если для этой переменной ранее не было установлено ничего, тогда переменная %id% устанавливается на приглашение set команды !! Так что теперь %id% установлено значение, Enter ID: которое было отображено на вашем экране в соответствии с запросом в командном файле ДО того, как вы вызвали jstack.
Читайте также: