Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Управление из командной строки


Рекомендуемые сообщения

CreatoR:

как всё-таки копировать несколько файлов в одной строке?
Так ты же сам указал, например, команда "copy исходная_папка\*.adr папка_назначения" будет копировать сразу все файлы с расширением adr. Ну, а целиком дерево папок и файлов копирует, как известно, команда xcopy (с ключами /s или /e). А вот если надо копировать только из определенных подпапок, да еще и только файлы с определенными расширениями, для которых нельзя подобрать общий шаблон (со звездочкой или вопросительными знаками), то все становится сложнее.

По сути, тут тройной цикл: по папкам, по расширениям имен файлов в этих папках и по самим именам файлов с этими расширениями в этих папках. Один цикл выполняет сам шаблон (*) в команде copy, два надо писать явно. А каждый шаг по пути наращивания сложности конструкций дается все труднее.

Я бы предпочел написать для простоты отдельно три цикла:

@for %%I in (adr dir dat) do copy исходная_папка\images\*.%%I другая_папка\images

и еще два аналогичные с папками sessions и mail.

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

for %%I in (images sessions mails) do for %%J in (%%I\*.adr %%I\*.dir %%I\*.dat) do echo %%J

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

Какая команда задаёт определённый размер (и/или шрифт) выводимому тексту (такому как сообщение после echo), если такое возможно конечно?
Насчет размера и вида шрифта - он задается командному процессору в реестре и внутри окна его менять нельзя. Если хочется что-то как-то отметить внутри окна, то можно "на ходу" менять цвет букв и фона под ними. По идее, они задаются тоже в реестре, но можно менять их и изнутри окна, прикладываю утилиту для этого, пример использования:

col 14 3

Тут 14 - номер цвета шрифта, 3 - номер цвета фона. Соответствие цветов номерам проще попробовать, цвета могут меняться от 0 (черный) до 15, хотя можешь попробовать и до 32. Если хочешь, чтобы изначально цвет фона окна был другим, используй эту утилиту первой, а после нее дай команду cls, она сотрет все бывшие ранее записи в окне и закрасит окно выбранным ранее цветом фона. А потом можешь менять цвет перед выводом каких-то новых строк специально для них повторными использованиями утилиты col.

test6.zip

col.zip

test6.zip

col.zip

Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 589
  • Создана
  • Последний ответ

Топ авторов темы

Тролль:

CreatoR: Так ты же сам указал, например, команда "copy исходная_папка\*.adr папка_назначения" будет копировать сразу все файлы с расширением adr.

Извени, но в прошлом посте я не так объяснил. Мне надо скопировать из одной папки, все файлы с расширением *.dat, из той же папки, все файлы с расширением *.dir, и опять же, с той-же папки все файлы с расширением *.adr - А те три папки (Sessions, mail, images), нужно копировать тоже из той папки, но целиком каждую из них, а не конкретные файлы из каждой из них!

По идее, они задаются тоже в реестре, но можно менять их и изнутри окна, прикладываю утилиту для этого, пример использования...

Огромное Спасибо за утилиту. Вначале, прочитав твой пост, мне казалось что она делает тоже самое, что и команда color, но проверив эту утилию, я удивился! Класная вещь! -В отличие от команды color, Она красит цвет фона именно самих букв а не всего окна, и цвет букв на этом фоне!

Изменено пользователем CreatoR
Ссылка на комментарий
Поделиться на другие сайты

CreatoR:

(Хотя это будет не верно - это для примера):

copy /y echo if exist " > 1.txt+c.txt+echo \profile\*.adr" "..\profle\*.adr" >> 1.txt - Но как ты понимаеш, та утилита что ты мне дал, здесь не поможет

Да уж, тут, по-моему, вообще ничего не поможет. Разве что пол-литра... :rolleyes: :)

Итак, нужно в файле создать строку

if exist "<users's folder>\profile\*.adr" "..\profile\*.adr"

причем <users's folder> - это имя, записанное в файле, назовем этот файл для определенности uf.txt, куда это имя по команде copy con uf.txt ввел пользователь. Ну и отлично, пишем

ech "if exist " 034 > f1.txt

copy /y f1.txt + uf.txt f1.txt

ech "\profile\*.adr" 034 " " 034 "..\profile\*.adr" 034 >> f1.txt

echo. >> f1.txt

Вроде все. Конечно, файл утилиты ech должен находиться рядом с батником в той же папке. На всякий случай прикладываю пример, там у меня в файле uf.txt записано имя m m m.

И кавычки ничем никому не мешают, просто знак кавычек в строке интерпретируется как служебный символ, а когда он должен быть самим собой, он вводится вне закавыченных строк просто как символ с номером 034. Так можно сконструировать текст любой команды.

Насчет копирования, ну так:

for %%I in (adr dir dat) do copy /y исходная_папка\*.%%I целевая_папка

- файлы с этими расширениями скопированы. Если у исходной и целевой папок более сложные адреса, значит, в тексте команды должны быть нужные адреса.

То же можно было сделать тремя отдельными командами

copy /y исходная_папка\*.adr целевая_папка

copy /y исходная_папка\*.dir целевая_папка

copy /y исходная_папка\*.dat целевая_папка

- если циклы кажутся трудной конструкцией.

Дальше,

for %%I in (images sessions mails) do copy исходная_папка\%%I целевая_папка\%%I

- скопировали все файлы из подпапок images sessions mails исходной папки в соответствующие подпапки целевой папки (эти подпапки команда copy сама не создаст, их надо создать предварительно с помощью трех команд md (можно, конечно, и одной командой внутри цикла for).

А сами команды конструируются, как это было показано вначале.

test7.zip

test7.zip

Ссылка на комментарий
Поделиться на другие сайты

Тролль:

Насчет копирования, ну так:

for %%I in (adr dir dat) do copy /y исходная_папка\*.%%I целевая_папка

-Всё, у меня почти получилось минизировать количество вводимых команд в батнике, и файлов в папке с ним. Говорю почти, потому что есть одна маленькая проблемка: Когда я пытаюсь вывести команду для копирования нескольких файлов в текст файл, то знаки %%I выводятся с одним знаком процента. Например: если попытатся внедрить следующую команду в текст-файл - ech "\profile\*.%%I" 034 " " 034 "..\profile" 034 > files.txt - то в текстовом файле files.txt выходит вот что - \profile\*.%I" "..\profile", то есть пропускается один знак процента (%)! -Как бы такое исправить? :rolleyes:

Ссылка на комментарий
Поделиться на другие сайты

Тролль:

Урааааа! :blush2: :sm(100): все тесты прошли испытания с минимум требовании к памяти, и к пользователю!

-Было бы совсем идеально, если бы ещё можно было сделать так, чтобы при не правильном вводе папки (т.е её место нахождения) пользователем, батник снова запускался, и спрашивал снова от куда копировать.

Я пытался это сделать, добавив в строку которая создаёт файл go.txt (см. прекреплённый test-8.zip - этот батник уже выполняет действие которое мне и требовалось изначально) ещё команду, которая должна запускать батник опять (т.е самого себя), в батнике test-8.bat, эта строка находится 10-ая по счёту, и она предназначена для вывода сообщения в случае отсутствия файлов, основываясь на вводе пути самим пользователем (эти файлы Обязаны быть там, ведь иначе копирование не произайдёт), и затем выхода из пакетного файла без дальнейшего продолжения сценария. А та самая команда (для запуска батника снова), по идее, должна находиться перед командой осуществляющей выход с пакетного файла. Но по непонятным мне причинам :no: , батник 'не хочет' запускаться снова, и 'доказывает' что он прав! :doh:

P.S: Я заметил один глюк в батнике, не знаю, может это только у меня так (система глючит и т.п) - Когда присутствует команда pause, иногда она не срабатывает, и приходится ставить аж две такие команды подряд: pause & pause, интересно, почему это так? :g:

P.P.S: Ах да, чуть не забыл, батник запускай осторожно, так как в конце он удаляет все файлы с расширением *.txt, поэтому лучше всего распоковать его в отдельную папку!

Test_8.zip

Test_8.zip

Изменено пользователем CreatoR
Ссылка на комментарий
Поделиться на другие сайты

CreatoR:

Было бы совсем идеально, если бы ещё можно было сделать так, чтобы при не правильном вводе папки (т.е её место нахождения) пользователем, батник снова запускался, и спрашивал снова от куда копировать.
Вместо запуска батником самого себя можно просто поставить метку в начале батника и переходить на нее (там можно и команду cls вставить для лучшего вида окна).
Ссылка на комментарий
Поделиться на другие сайты

CreatoR: Вместо запуска батником самого себя можно просто поставить метку в начале батника и переходить на нее (там можно и команду cls вставить для лучшего вида окна).

Что-то у меня не получается :D. Я поставил метку в самом батнике (в том который создаёт текст-файлы и ещё один батник), и в файл-батник который создаётся для выполнения копирования, я вывожу переход на эту метку (т.е команду для перехода), в случае неправильного ввода (пользователем) местонахождения папки с файлами для копирования. Но, таким образом переход к метке не происходит, потому как команда предназначенная для перехода к этой метке, находится в другом файле (в созданном батнике). А поставить метку в самом батнике (тот что создаётся) как ты понимаеш, нету никакого смысла, ведь по новой запускать нужно исходный батник (тот который всё создаёт). -Помоги пожалуйста с этим разобратся, вроде-бы всё просто (по сравнению с созданием всего этого 'проэкта'), а никак не могу понять, в чём же дело, как осуществить эту задачю!

P.S: Как я понял, без ввода F6 перед вводом ENTER не обойтись, так? (То есть, никак нельзя сделать чтобы нужно было вводить лишь ENTER?).

Ссылка на комментарий
Поделиться на другие сайты

CreatoR:

Особых сложностей не вижу.

Дочерний батник, если у него что-то не получилось (или наоборот, получилось), должен создать какую-то общедоступную метку, например, какой-то файл в папке наших пакетных файлов, наличие которого потом будет проверяться основным пакетным файлом.

P.S. Второй батник по роду вроде бы "м", но принято называть порожденные процессы, например, дочерними.

Насчет завершения ввода строки без F6 - без того чтобы написать или найти специальную утилиту, ИМХО не получится. Красивый ввод и вывод в пакетных файлах не был предусмотрен.

Ссылка на комментарий
Поделиться на другие сайты

Тролль:

Кто бы мог подумать, что сегодня я смог создать батник (с твоей незаменимой помощью разумеется :) ), содержание которого, ещё пару недель назад вызывало бы у меня желание прекратить вообще возиться с батниками! :)

-Выкладываю Test-Reliz (Test-Reliz.zip), заключающий работу над батником предназначенным для переноса личных настроек из 'старого' Браузера 'Opera' в новый!

-Также выкладываю Батник, который ранее обсуждался где-то Тут. -Это переключатель системного аттрибута папки\файла, и мне удалось немного его модифицыровать с помощью тех утилит, которые ты выкладывал ранее (col.exe, ech.exe), и естественно при помощи всей информации что ты мне дал.

Теперь он спрашивает для какой\го папки\файла активировать аттрибут 'Системный', и во второй раз запуска этого батника, он спрашивает хочет ли пользователь оставить системный аттрибут той\му папки\файлу которой в прошлый раз был присвоен системный аттрибут, или же поменять обратно на несистемный, и после этого указать какую\ой папку\файл сделать системной\ым. -Только есть одна значительная проблема (кстате она присутствует и в батнике с переносом файлов (Test-Reliz.zip): - Если пользователь, перед нажатим на F6, нажмёт на ENTER (может случайно, или от незнания\непонимания), то после нажатия на F6 и затем снова на ENTER, получится ошибочный (не коректный) состав Дочернего файла (того который создаёт исходный батник), что приводит к выходу из батника, и остатка лишних файлов в папке с батником (Так как они удаляются лишь в том случае, если заданый путь {пользователем} не существует, или если операция {копирование} прошла успешно).

Тролль: Запусти батник (Start.bat - из архива Switcher_For_System-non-System_Folder.zip), и на вопрос какую папку сделать системной, напиши Folder (эта папка присутствует в этом же архиве), затем следи за изминением этой папки, Думаю тебе понравится! :)

-А Также, прикладываю две утилиты что ты выкладывал ранее (они лежат в архиве Ech+Col_Utilities_Info.zip), но, добавил к ним (рядом с ними в папке), батник (Ech+Col_Info.bat), при запуске которого, выводится информация о них. Т.е, для утилиты Col.exe, выдаётся инфо о том какие значения (ключи) нужно подставлять к команде col, для вывода того или инного цвета. А для утилиты Ech.exe, выводится информация о ключах свазанных с командой ech - Надеюсь ты не против :) !

P.S: В архиве Switcher_For_System-non-System_Folder.zip, присутствует также батник (Clean the Switcher (start).bat), предназначен для отчистки файлов которые появляются для метки (по которой распознаётся предыдущая папка, которой был присвоен аттрибут 'Системная'), и для дизактивации систeмного аттрибута папкам которые присутствуют в этом же архиве (Folder и Example) - Они существуют для примера (для теста)!

Test_Reliz.zip

Switcher_For_System_non_System_Folder.zip

Ech_Col_Utilities_Info.zip

Test_Reliz.zip

Switcher_For_System_non_System_Folder.zip

Ech_Col_Utilities_Info.zip

Ссылка на комментарий
Поделиться на другие сайты

CreatoR:

Да, батники ты скоро будешь писать с закрытыми глазами ;) .

Батник по смене атрибута папки мне понравился, а особенно иконка ;)

Конечно, нажимать в конце ввода F6 и Enter сбивает.

Но в конце концов мы же не присягали пользоваться только утилитами от Microsoft, тем более уже пару полезных использовали. Готовой утилиты для ввода строки я не нашел, но написать ее куда быстрее, чем этот пост. Поскольку под рукой был Turbo Pascal, то я и написал (там почти нечего писать) утилитку rw.exe (сокращение от readwrite), которая берет с клавиатуры строку и выводит ее тут же на стандартный вывод, то есть нормально на экран, а если вывод перенаправить в файл, то в файл, что и требуется. Вывод для удобства сделан "чистым" , без автоматического перевода строки, как по команде copy con файл. Только F6 нажимать не требуется, ввод заканчивается просто нажатием Enter.

Так что возвращаю твой пример, в котором ввод с клавиатуры берет на себя эта утилита. Удобно будет ее и в программе копирования настроек для Оперы использовать.

Switcher.zip

Switcher.zip

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

CreatoR:

Да, батники ты скоро будешь писать с закрытыми глазами :D .

Тролль:

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

Мне надо было вставать рано утром, а будильника под рукой небыло :no: , и когда я ложился спать (после долгого просижывания и разбирания команд баника), то я, образно (и я не шучю), хотел задать себе команду чтобы проснуться рано. Образно, это выглядело так:

:again

if exist 06:00ам goto wakeup

sleep & goto again

:wakeup

wakeup now!

:D :) :)

-Ну разве не маразм? :g:

Ладно, хватит флудить! :D

-Во-первых, Огромное :) за написание утилиты для 'ликвидации' раздражающего ввода F6.

-Во-вторых, есть один вопрос: Можно ли каким-то образом, прикрутить к этой утилите (rw.exe) команду для выхода из батника (exit)? -Хотя это не так уж и важно, но это так, для того чтобы уже совсем идеально получилось.

Я пытался осуществить это посредствам самого батника - Т.е, если пользователь вводит слово exit, то в дочернем батнике прописывается соответствующaя строка в самом его начале, и при его запуске (дочернего батника), он сразу же выходит, не выполняя никаких действии. Но, ах это 'Но', таким образом не удаётся стереть файлы оставленные родительским батником (исходным), так как они стираются в случае выполнения удачной (или неудачной) операции дочернего батника, самим дочерним батником. -Кстате, всё это меня наводит на ещё один вопрос, ответ которого может помочь этой проблеме: Есть ли такая команда, которая позволит вставить строку считанную с текстового файла, в родительский (или в любой другой) батник, но в указанную строку (допустим в последующею строку после этой команды)? Т.е, при запуске этого батника, и с присутствием данной команды в нём (если такая вообще есть), при достижении строки с этой командой, строка находящаяся в указанном текст-файле, будет скопирована под строку выполняющую эту команду, и затем естественно, батник попытается выполнить эту строку (в данном случае это будет команда exit, так как указать текст-файл надо будет имено тот, который создаётся после ввода пользователем, словa exit).

Изменено пользователем CreatoR
Ссылка на комментарий
Поделиться на другие сайты

CreatoR:

Можно немного упростить :D :

:again

sleep

if not exist 06:00ам goto again

wakeup now!

Ну разве не маразм? :)
Не маразм. Нормальное состояние программиста :) .
не удаётся стереть файлы оставленные родительским батником (исходным), так как они стираются в случае выполнения удачной (или неудачной) операции дочернего батника, самим дочерним батником.
Не совсем понял - если файлы создал родительский батник, то ему, по справедливости, и полагалось бы их стирать. Как сказал Тарас Бульба: "Я тебя породил, я тебя и убью". Это лучший стиль программирования, так как общеизвестно, что у семи нянек дитя без глаза (то есть без должного надзора).
Есть ли такая команда, которая позволит вставить строку считанную с текстового файла, в родительский (или в любой другой) батник, но в указанную строку (допустим в последующею строку после этой команды)? Т.е, при запуске этого батника, и с присутствием данной команды в нём (если такая вообще есть), при достижении строки с этой командой, строка находящаяся в указанном текст-файле, будет скопирована под строку выполняющую эту команду, и затем естественно, батник попытается выполнить эту строку
Вообще-то основной батник может просто вызвать с помощью команды call подчиненный батник, который можно сформировать заранее вместе с нужной в нем строкой. Собственно, так мы и делали.

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

P.S. Забыл упомянуть, в примерчике два файла: t1.bat и t2.bat, запускать надо t1.bat, второй просто содержит в себе дополнение к первому файлу, ему можно было дать любое расширение. Текст файлов просмотри перед первым выполнением, поскольку при выполнениях первый батник будет каждый раз удлиняться (конечно, его легко восстановить). А вообще самомодифицирующиеся программы принадлежат опять же к числу трюков, а не к нормальной технологии программирования. Ими увлекались в те времена, когда программистов ценили как фокусников, по числу имеющихся в их багаже программистских трюков, а программирование было искусством, а не технологией.

Test9.zip

Test9.zip

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Тролль:

CreatoR:

Можно немного упростить ;) :

:again

sleep

if not exist 06:00ам goto again

wakeup now!

-Спасибо, теперь мой Образный будильник будет быстрее обрабатывать команды! :D

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

Я немного не так обьяснил.

-Дело в том, что мне, для реализации данного действия (выхода из батника после ввода пользователем слово Exit), нужно чтобы при трёх разных условиях, выполнялись три разных действия - То есть:

1) Если пользователь вводит правильный путь (это путь к опере), то выполняется копирование - Это, как известно, Достигнуто.

2) Если пользователь вводит что ему влезит в голову (т.е не существующий путь\файл\папка и т.д), то родительский батник запускается снова - Это, как известно, тоже Достигнуто!

3) Если пользователь вводит слово (команду) EXIT, То естественно должен происходить выход из пакетного файла (из дочернего, при этом не запуская родительского батника, и не оставляя никаких следов - т.е файлов) - Это, как известно, НЕ Достигнуто! :blushing: .

-Я пробовал осуществить это, и как ты посоветовал в тесте-9, я соеденил файл тескта (который образуется в результате пользовательского ввода) с родительским батником, но команда (ехit) в конце родительского батник мне не нужна, она нужна либо в его центре, либо в начале, но попытки добавить из текстового файла в начало родительского батника закончились неудачей, а, как ты обьяснил, поставить эту команду в центр батника, будет не лёгкой здачей (точнее очень сложной).

З.Ы:

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

У меня получается парадокс! -Ведь для того чтобы поставить команду EXIT (введённую пользователем) в дочерний батник, нужно (желательно) удалить остатки файлов. А чтобы их удалить, нужно запустить родительский батник, так как выполнение двух условии (выполнение копирования и запуск род. батника по новой) основывается на текст файлах которые и следует удалять в случае ввода команды Exit пользователем!

З.З.Ы:

Как я понимаю, всё это тебя очень наверно замучело (вернее не 'Это', а Я), так что думаю, пока-что можно оставить в покое эту задачю - Да и не так уж это важно, ну подумаешь, будет пользователь выходить традиционным способом - Левой кнопкой мыши по правому-верхнему крестику окна, и затем подтверждать выход! -В конце концов, единственная пречина на сегодняшний день, по которой я хотел это осущетвить, является пополнением запаса своих знании и возможностей - а на счёт предостовления удобств пользователям (если вообще есть таковы, за исключением меня самого ;) ), то думаю мне ещё рано об этом думать!

Ссылка на комментарий
Поделиться на другие сайты

CreatoR:

Как я понял, после ввода имени в файл ты хочешь проверить, что это за имя, и если это exit, то надо все за собой убирать и заканчивать работу, а если не exit, то это имя папки и надо что-то делать - то ли ее создавать, то ли из нее копировать - я уже не помню, что было в твоем батнике, но это неважно.

Тогда вот примерчик (test10), который проверяет вводимое в файл имя, и если там exit, то выводит It is!, а если нет - Hmm... Выбор действия сделан переходами на метки, так что вместо вывода восклицаний можно задать любые действия. В команду if я включил ключ /i, который предписывает команде считать эквивалентными строчные и заглавные латинские буквы.

test10.zip

test10.zip

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Тролль:

Как говорят: "Всё гинеально, Просто" :diablo1: - Я и не думал что так просто можно решить эту, казалось бы, нерешимую задачку!

Я никогда не устану говорить (Писать) тебе, огромное :diablo1:! -Это (test10) то, что и требовалось!

-Как я понял, вот эта команда: for /f %%I in (mt.txt) do if /i %%I==exit goto m1, проверяет состав текстового файла (в данном случае это файл mt.txt), и сравнивает его со словом exit. Затем, если есть совпадение, происходит переход на метку (в данном случае это m1. Тогда вопрос: А можно ли как то переделать эту команду, но чтобы вместо сравнения слова Exit с содержимым текст-файла, происходило распознавание существующего пути (в текстовом файле), Т.е, чтобы в случае неверного ввода пути пользователем (несуществующего файла по этому пути), эта команда передовала бы управление метке.

Я примерно, прдставляю себе это так: for /f %%I in (mt.txt) do if %%I==%Path% goto metka - Это только для примера :diablo1: , я знаю что эта команда далека от истены! -Если такое возможно, то это предотвратит переход в дочерний батник, и создание некоторых команд и файлов!

P.S:

Кстате, а какова функция ключа /f:diablo1: -В командной строке (по вводу for /?) ничего объясняющего этот ключь, я не нашёл.

Изменено пользователем CreatoR
Ссылка на комментарий
Поделиться на другие сайты

CreatoR:

А можно ли как то переделать эту команду, но чтобы вместо сравнения слова Exit с содержимым текст-файла, происходило распознавание существующего пути (в текстовом файле), Т.е, чтобы в случае неверного ввода пути пользователем (несуществующего файла по этому пути), эта команда передовала бы управление метке.
Попробуем... Прикладываю батник test11.

Батник просит ввести путь к файлу или папке или слово exit, после чего, если было введено слово exit, заканчивает работу, а если нет, то проверяет правильность введенного пути и, если его не существует, выдает об этом сообщение и просит ввести путь снова, а если все в порядке, сообщает об этом.

Для чистоты примера я, как и в предыдущем примере, использовал ввод в файл с клавиатуры стандартными средствами (с завершением F6 Enter), можно, конечно, использовать и утилиту rw.exe.

Кстате, а какова функция ключа /f :) -В командной строке (по вводу for /?) ничего объясняющего этот ключь, я не нашёл.
Хм, "Такие тайны разбалтывают только начинающие чародеи." :)

(Марк Твен, "Янки при дворе короля Артура")

Если серьезно, то ключ /f задает команде for брать параметр для обработки из указанного в команде файла, а не из самого текста команды. Все же это все-таки есть в справке, посмотри ее еще раз :( .

По умолчанию из файла берется текст до первого разделителя элементов текста (по умолчанию пробела). Для слова exit это подходит, но для пути надо указать команде не считать пробел разделителем элементов текста, поэтому во второй for включен еще параметр "delims=", задающий пустое множество разделителей.

Dosus:

Это зависит от того, что внутри файла. Все, что стоит за именем файла - это параметры без какого-то одинакового для всех батников значения. С ними разбираются команды, записанные в пакетном файле, которые могут интерпретировать эти параметры как угодно, смотря по тому, что написано в пакетном файле его автором.

P.S.

Dosus:

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

test11.zip

test11.zip

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Тролль:

Попробуем... Прикладываю батник test11.

А что пробовать, ты попал в точку с первой попытки! :) -Теперь можно считать, что идеал с данным батником, Достигнут!

-К команде, которая проверяет правильность пути, я добавил папку и нужные файлы, для того чтобы

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

for /f "delims=" %%I in (c.txt) do if exist "%%I\profile\*.adr" goto ok

З.Ы:

Приклладываю финальную (надеюсь) версию батника :bye1: , предназначенного для переноса личных настроек из 'старого' Браузера 'Opera' в новый!

Opera_Opt_Trans_Final.zip

Opera_Opt_Trans_Final.zip

Ссылка на комментарий
Поделиться на другие сайты

Внимание, Внимание!

Выкладываю 'Супер-Батник' (RegAdd_for_Create_BathFile.zip), который создаёт запись в реестре. Эта запись позволяет создавать батник посредствам контекстного меню виндоуса. А также, он прописывает батнику, другое определение названию типу файла - Если раньше под именем батника было написано 'Пакетный файл MS-DOS', то теперь там будет написано 'BATHiK', плюс, создание батника будет происходить с шаблона, который создаст этот 'Супер-Батник' в подпапке SHELLNEW в корневой папки виндоуса. И не просто будет создаваться батник, он будет сразу создан под именем 'BATHiK', и содержать основную команду, которую ИМХО, должен содиржать каждый батник (почти) в его начале - @echo off

-И если этого мало, то этому батнику будет присвоена красивая иконка, которая во время 'Устанивки' скопируется в папку виндоуса, и батник укажет на неё путь в реестре - Но, эта иконка будет отображаться только после перезагрузки винды!

Перед установкой иконки батник спросит, нужно ли её устанавливать!

-Теперь, после установки (и после перезагрузки, если конечно была установлена иконка), ждём пару минут (думаю минуты хватит :bad3: ), и нажимаем в любом пустом месте папки, на правую кнопку мыши, переходим в подменю 'Создать', и Уола! sunglasses2.gif -Видем новый пункт 'BATHiK' - batnik.png

З.Ы:

Тролль: Кстате, мне удалось закончить этот батник, только благодаря той команде, что ты мне дал для сравнения определённого слова (опр. символов) с составом текстового файла, который создаётся на основе ввода пользователем! А также я воспользовался в нём двумя из утилит что ты мне давал (col.exe и rw.exe)

RegAdd_for_Create_BathFile.zip

RegAdd_for_Create_BathFile.zip

post-38267-1148113566_thumb.png

Изменено пользователем CreatoR
Ссылка на комментарий
Поделиться на другие сайты

CreatoR:

Выкладываю 'Супер-Батник' (RegAdd_for_Create_BathFile.zip)
Все отлично работает :g: . Смотри, скоро к тебе выстроится очередь с заказами на написание батников :)

Wu-Tang, CreatoR

Продолжаю тут обсуждение написания батников из топика Ярлык, один на несколько прог.

Вопрос был о командах chdir и cd.

Насчет того, что chdir приказывает следующей команде cd правильно понимать имена с пробелами, это не совсем так. cd и chdir - просто два имени одной и той же команды, полностью эквивалентные (так бывает не только для chdir, но, например, и для rename и ren, или mkdir и md, или erase и del). Первый вызов chdir никак не влияет на второй вызов с именем cd. cd или chdir и так правильно понимает имена с пробелами. A chdir - само по себе было сокращением от change directory, но такие длинные имена командам MS-DOS не давали, я просто хочу пояснить, откуда взялось имя команды.

А команда cd (или chdir) без параметров играет чисто информативную роль, она выдает на экран путь к текущему каталогу на текущем диске (на каждом диске существует и независимо задается текущий каталог - исходный для поиска путей к папкам и файлам, если они заданы в сокращенном виде (не от корневого каталога).

Что касается проблемы с именами, содержащими пробелы, то некоторые команды, вроде cd, разбираются с такими именами сами, некоторые (большинство) требуют заключить весь путь в кавычки, некоторые, вроде start, хотят, чтобы в кавычки заключалась каждое имя в пути, содержащее пробелы.

Если неясно, какой вариант использовать для какой команды, это несложно попробовать. Разнобой существует потому, что Windows создавалась путем эволюции, то есть бесконечного наложения на старую систему заплат и усовершенствований, и правая рука часто не знала, что делает или делала левая :) .

И, конечно, почти всегда можно использовать сокращенные до стандарта DOS 8+3 имена наподобие GmailN~1 (имена могут быть и немножко другими, если файловой системе надо избежать дублирования еще одного такого же имени), которыми файловая система дублирует длинные имен (почти - потому что автоматическое создание и хранение системой этих имен можно для некоторого ускорения работы отключить).

Без переменной %programfiles% в путях обходиться можно, просто она делает имя пути немного более универсальным, так как каждая Windows помещает в эту переменную путь к папке с программными файлами, а он в разных Windows может быть разным. Можно и просто написать cd /d С:\Program files, это будет работать когда программные файлы лежат на диске C в этой папке Program files, это так в большинстве случаев, но не всегда.

Ссылка на комментарий
Поделиться на другие сайты

CreatoR: Тролль:

Хочу сказать, что start c:\progra~1\GvozdSoft\NewMai~1\NewMai~1.exe который дал CreatoR не пашет.

А пашет, только, повторюсь, тот, что написал Roader!

C:Cd C:\PROGRA~1\GVOZDS~1\NEWMAI~1start C:\PROGRA~1\GVOZDS~1\NEWMAI~1\Newmai~1.exe

А полный список батника:

C:Cd C:\PROGRA~1\GVOZDS~1\NEWMAI~1start C:\PROGRA~1\GVOZDS~1\NEWMAI~1\Newmai~1.exestart C:\"Program Files"\Google\"Gmail Notifier"\gnotify.exe"start C:\"Program Files"\Mail.Ru\Agent\Magent.exestart C:\"Program Files"\Agnitum\"Outpost Firewall"\outpost.exestart C:\"Program Files"\LeoSoft\"DialUp Monitor"\dialmon.exestart C:\"Program Files"\DrWeb\spiderml.exestart C:\"Program Files"\Opera\Opera.exestart C:\"Program Files"\QIP\qip.exe

Так что видимо Тролль прав, что для каждой программы нужен свой способ прописывания пути!

CreatoR:

Так что не получиться написать для нее путь с длинными именами и без Cd С:..., я про new mail informer!

Ссылка на комментарий
Поделиться на другие сайты

Тролль: и Wu-Tang:

Хочу сказать, что start c:\progra~1\GvozdSoft\NewMai~1\NewMai~1.exe который дал CreatoR не пашет.

Тогда как объяснить тот факт, что у меня работает то, что у тебя (Wu-Tang) не работает? :) (тот пример который ты привёл веше, в цитате).

Получается всё зависит от типа запускаемого экзешника? :) -что то я совсем запутался :) , вроде мы тут с Троллем разбирали команды куда похуже (по сложнее) чем эти...

А полный список батника:

Код

C:

Cd C:\PROGRA~1\GVOZDS~1\NEWMAI~1

start C:\PROGRA~1\GVOZDS~1\NEWMAI~1\Newmai~1.exe

start C:\"Program Files"\Google\"Gmail Notifier"\gnotify.exe"

start C:\"Program Files"\Mail.Ru\Agent\Magent.exe

start C:\"Program Files"\Agnitum\"Outpost Firewall"\outpost.exe

start C:\"Program Files"\LeoSoft\"DialUp Monitor"\dialmon.exe

start C:\"Program Files"\DrWeb\spiderml.exe

start C:\"Program Files"\Opera\Opera.exe

start C:\"Program Files"\QIP\qip.exe

Wu-Tang:

Тогда попробуй так:

cd /d C:\PROGRA~1\GVOZDS~1\NEWMAI~1start Newmai~1.execd /d C:\PROGRA~1start Google\"Gmail Notifier"\gnotify.exestart Mail.Ru\Agent\Magent.exestart Agnitum\"Outpost Firewall"\outpost.exestart LeoSoft\"DialUp Monitor"\dialmon.exestart DrWeb\spiderml.exestart Opera\Opera.exestart QIP\qip.exe
Ссылка на комментарий
Поделиться на другие сайты

Wu-Tang:

Так что не получиться написать для нее путь с длинными именами и без Cd С:...,
Вообще-то, раз батник по Roader'у работает, выяснять, где что не так было написано в другом варианте, уже не столь важно, но попробуем, если тебе не лень.

1. Замени для начала в работающем батнике строку start... на строку с длинными именами, при этом содержащие пробел имена бери в кавычки. Проверь, работает ли батник.

2. Затем замени строку cd... на строку с длинными именами, при этом кавычки поставь не вокруг длинных имен, а вокруг всего пути. Проверь, работает ли батник.

3. Затем убери кавычки в команде cd. Проверь, работает ли батник.

4. Затем убери вообще команду cd. Проверь, работает ли батник.

5. Затем убери команду C:. Проверь, работает ли батник.

И напиши, на каком этапе батник перестал работать.

Ссылка на комментарий
Поделиться на другие сайты

Тролль:

1. Замени для начала в работающем батнике строку start... на строку с длинными именами, при этом содержащие пробел имена бери в кавычки. Проверь, работает ли батник.

1 Т.е вместо:

C:Cd C:\PROGRA~1\GVOZDS~1\NEWMAI~1start C:\PROGRA~1\GVOZDS~1\NEWMAI~1\Newmai~1.exe

Пишу:

C:Cd C:\PROGRA~1\GVOZDS~1\NEWMAI~1C:\"Program Files"\"GvozdSoft"\"New Mail Informer"\"New Mail Informer.exe"

И уже сразу не пашет!

уже не столь важно, но попробуем, если тебе не лень.

Попробуем, конечно, не лень!

У меня такое ощущение, что эта чудо программа, работает только по способу Roadera!

Если мне не верите - прикладываю чудо программку.

Прога free, а экзешник в архиве лежит для того, что там пофиксинный баг и им надо заменить оригинал!

Повторю это никакой не кряк!

1.zip

1.zip

Изменено пользователем Wu-Tang
Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу



×
×
  • Создать...