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

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


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

Тролль:

Я ещё раз повторюсь, и напишу:

"Всё гинелаьно, Просто" sunglasses2.gif

:D

З.Ы:

Извеняюсь за оффтоп :D

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

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

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

Тролль:

CD > Path.txt

Есть вопрос - Как заставить работать команду CD, с командой (утилитой) ech. Т.е, мне нужно чтобы после вставки пути с файла Path.txt, вставлялась кавычка, но в силу того что команда CD, как и команда echo например, переходит на другую строчку, я не могу этого сделать :bye1:

З.Ы:

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

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

CreatoR:

Проще всего уладить этот вопрос с помощью нашей старой утилитки rw.exe:

cd | rw > path.txt

Пробелы тут, естественно, не обязательны.

Кстати, rw отлично заменяет и утилиту ech:

echo Hello, CreatoR! | rw > pp.txt

В pp.txt будет строка без завершающего перевода строки. Если в тексте внутри echo будут кавычки, их, в отличие от ech, где они являются служебным символом, не надо удваивать.

По терминологии MS-DOS, утилита rw.exe принадлежит к фильтрам - она берет со стандартного входа входную строку и фильтрует ее содержание, пропуская на стандартный выход символы этой строки до тех пор, пока в ней не встретятся символы перевода строки.

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

Тролль:

Кстати, rw отлично заменяет и утилиту ech

Ты хочешь сказать, что я могу напрочь убрать утилиту ech.exe из моего 'Арсенала' для батников, и вместо неё пользоваться командой - echo текст | rw.exe > file.txt ?

Тогда как подставлять разные знаки, которые команда echo воспринемает как служебные?

Например, echo helo CreatoR & goto end | rw.exe > file.txt - Эта команда, выведет в file.txt это содержание?: helo CreatoR & goto end (просто щас нет возможности проверить) - Если нет, тогда как это сделать (используя только rw.exe).

Если в тексте внутри echo будут кавычки, их, в отличие от ech, где они являются служебным символом, не надо удваивать.

Что то я не допонял :blink: , разве в утилите ech.exe, при надобности вывести кавычки как служебные (те, которые в файл впишутся), нужно удваиваыь их, разве для этого команда (ключь) 034 не подходит? :g:

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

CreatoR:

Начну со второго вопроса.

разве для этого команда (ключь) 034 не подходит?
Вполне подходит, просто я об этом забыл, давно ею не пользовался.
echo helo CreatoR & goto end | rw.exe > file.txt - Эта команда, выведет в file.txt это содержание?: helo CreatoR & goto end
Н..нет, символ & служебный, вместе с ним в команду echo, да и в конвейер |, приходят тонкости...

Помнишь вереницу знаков % в одном из наших файлов? Будет нечто подобное.

При твоем написании выполнится команда echo, выдав на экран всё до символа &, затем будет выполнена идущая за знаком & команда goto, а она бессловесная - и в файл file.txt ничегошеньки записано не будет.

Чтобы все было тип-топ, надо отменить служебное значение символа & предшествующим служебным символом ^, тогда echo выкинет из строки служебный символ ^, а символ & интерпретирует как обычный и выдаст в строку, направляемую в конвейер, который тут же опять интерпретирует символ & как служебный и все испортит.

Поэтому надо войти и в положение конвейера и указать ему на то, что символ & в выданной ему строке не служебный, для чего надо, чтобы этому символу при его попадании на конвейер предшествовал символ ^. Но этот символ тоже служебный, поэтому чтобы команда echo интерпретировала его как неслужебный и выдала дальше на конвейер, его служебное значение должно быть отменено опять же символом ^, предшествующим тому, который надо выдать на конвейер.

Если ты еще не заснул :D , то результат этих логических выкрутасов выглядит так:

echo helo CreatoR ^^^& goto end | rw > file.txt

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

Тролль:

...Если ты еще не заснул :) , то результат этих логических выкрутасов...

Тут, я чуть не упал со стула (от смеха) laugh.gif

echo helo CreatoR ^^^& goto end | rw > file.txt

Тогда есть ещё вопрос:

*Можно ли применять такой способ, на всех остальных служебных символах? Т.е, Для получения желаемого результата (описанного тобой при помощи логических выкрутасов :D ), допустим для символов ||, нужно вписать такую строку?:

echo echo tralyalya ^^^|| del tralyalya.txt | rw.exe > tralyalya.txt

И таким образом в файл tralyalya.txt впишется эта строка: echo tralyalya || del tralyalya.txt - Это Так? -Логика подсказывает что да, а мой мизерный опыт, что нет :) :)

З.Ы:

*И ещё, как я понял, для диактивации (для помещения текста в файл) служебного символа в команде echo (без надобности в НЕ переходе на другую строку, и без утилиты rw.exe), перед ним нужно добовлять всего один знак ^ - Но тут появляется вопрос похожий на предыдущий: -Можно ли подставлять такой символ под все служебные знаки, в которых есть (будет) надобность диактивации для помещения их в файл?

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

CreatoR:

Ты хочешь включить символ | в файл? Тогда

echo echo tralyalya ^^^| del tralyalya.txt | rw.exe > tralyalya.txt

А если бы надо было просто вывести его в файл без передачи конвейером через убирающую перевод строки rw, то echo echo tralyalya ^| del tralyalya.txt > tralyalya.txt

Действует ли знак ^ для всех служебных символов? :D За все не ручаюсь, но обычно да.

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

Тролль:

Короче говоря, мне стало скучно, и я решил провести тест, который по идее, должен был дать ответ на мой вопрос, по поводу того, можно ли будет подставлять Символ ^ под все символы которые считаются служебными (для их вывода в файл). Так вот, результаты не удовлетворяющие - Выходит так, что в конкретном случае, и с конкретными символами, нужно либо иметь стабильные знания (которых у меня к сожалению, на данный момент, нет), либо делать методом втыка, тестов, и проб. -Всегда eсть конечно возможность использовать утилиту ech.exe, но как мы уже выяснили (а также, в этом посте, выясним по подробнее), у неё есть свои недостатки (точнее один недостаток)!

Выкладываю результаты тестов:

Прописав все существующие символы на клаве (у меня по крайней мере :blush2: ) в батник (см. код), через передачу конвеером (|) в убирающую переход строки утилиту (команду) rw, и затем его (батник) запустив...

echo ^^^| ^" ^* ^> ^& ^% ^$ ^# ^^ ^} ^{ ^[ ^] ^@ ^! ^( ^) ^+ ^= ^? ^_ ^' ^< ^` ^~ ^- ^, ^.|rw > test1.txt

В текстовом файле test1.txt, прописалась следующая строка:

| " * > & $ # ^ } { [ ] @ ! ( ) + = ? _ ' < ` ~ - , .

Вывод: В этом порядке, и с этими, спецефически подставленными знаками ^, все знаки (служебные - те что после символа\ов ^) прописываются в файл test1.txt - Однако, если поменять местами некоторые из них (например, поставить символы ^> перед символами ^"), или убрать подставленные у символа | два символа ^ (вот так: ^|), или поставить символы ^& в начало команды (после echo), и т.д и т.п, то происходит сбой (не буду вдаваться в подробности, т.к всё равно не смогу объяснить коректно :D ).

Далее....

Прописав все существующие символы на клаве в батник (см. код), БЕЗ передачи конвеером (|) в убирающую переход строки утилиту (команду) rw, и затем его (батник) запустив...

echo ^| ^" ^* ^& ^% ^$ ^# ^@ ^! ^[ ^] ^{ ^} ^( ^) ^+ ^= ^? ^_ ^' ^< ^> ^` ^~ ^- ^, ^. > test2.txt

В текстовом файле test2.txt, прописалась следующая строка:

| " * & $ # @ ! [ ] { } ( ) + = ? _ ' < > ` ~ - , .

Вывод: В этом порядке, и в любом другом (проверял множество вариации), и с подставлением всего ОДНОГО символа ^, все знаки (служебные - те что после символа ^) прописываются в файл test2.txt.

Итог:

  • Если нет необходимости в выводе текста в файл, через передачю конвеером в убирающую перевод строки, коману - rw, тогда проще всего воспользоваться вторым тестом (test2.txt).
  • Если всё же есть такая необходимость (в убирании перехода строки при передаче текста в файл), тогда следует заняться личным эксперементированием, и выявлением того, какой способ более подходит к сочетанию, и последовательности того или инного Символа (который\е следует вывести в файл). В результате чего, выявить наиболее подходящий вариант сочетания и последовательности желаемых символов (для их вывода в файл), при спецефическом (на основе эксперементов) подставлении символов\а ^ под нужный-служебный символ (для его вывода в файл), для желаемого результат в файле!

Ты ещё не уснул...?

А вот я уже усыпаю :D (см. время создания поста)

P.S:

2ALL:

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

Инными словами, после запуска этого батника, в системе создаётся переменная среда, с именем Envir (Это для примера, можно отредактировать батник, и поменять в нём слово Envir, на любое желаемое), и со значением равняющимся пути к катологу в котором находится этот батник (тот который выполняет все описанные действия) - Т.е, допустим батник лежит в папке f:\My Files , тогда после его запуска, в системе пропишится переменная с таким именем: Envir, и с таким значением: f:\My Files - В результате можно будет указать переменную, как в батниках, так и в других местах виндоуса (например, в ярлыках) - а вписывать нужно вот это: %MyFiles% (это будет ссылаться на папку f:\My Files) ! ! !

Set_Envirenment.zip

Set_Envirenment.zip

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

CreatoR:

Обширное исследование... :bye1:

Дело в том, что некоторые символы из них все-таки не служебные, а некоторые "служат" по-разному, почему у тебя из-за перемены их местами результат слегка и коробит...

А "служебность" служебных символов ты отменил только для команды echo, но, за исключением знака |, не для конвейера.

Предшествующий знак ^ отменяет служебное значение только следующего за ним символа и только для одной ступени. Сочетание ^& пройдет через echo в виде &, знак ^, образно говоря, разминирует дорогу для & и при этом подорвется (это называется экранированием последующего символа). Конвейеру, чтобы пропустить &, опять нужно перед & знак ^, а его уже нет. Значит, перед & должно стоять два знака ^ - по одному на каждую ступень.

Но сочетание ^^& пройдет через echo так: первый знак ^ обеспечит прохождение второго, сам при этом уничтожившись. Затем появится знак &, но для него дорога опять заминирована (более того, он будет считаться признаком конца строки, которую echo должно было обработать). Итак, на конвейер попадет только знак ^.

Поэтому пошлем такой отряд: ^^^&. Первый знак ^, взорвавшись при прохождении echo, обеспечит доставку на конвейер второго знака ^. Третий знак ^, взорвавшись при прохождении echo, обеспечит доставку на конвейер знака &. На конвейере окажется цепочка ^&. При прохождении конвейера знак ^ взорвется, но знак & благодаря этому пройдет конвейер и вылезет с другого конца конвейера, потеряв всех попутчиков.

К сожалению, знак ^ кроме экранирования имеет и другое служебное назначение, проявляющееся для некоторых простых символов. Он применялся для получения букв, отсутствующих на клавиатуре, обычно букв с диакритическими (дополнительными) знаками. Ты это увидишь, напечатав ^a, получится в. В то же время с буквой b знак ^ ничего не делает. Так что иногда кто-нибудь из обработчиков строки решает, что знаки должны быть интерпретированы именно так. Поэтому лишние знаки ^ иногда мешают, хотя часто экранирование неслужебных знаков не влияет на их прохождение.

Так что, чтобы не составлять сложные таблицы классификации знаков, надо действительно просто пробовать, что получается, и при необходимости корректировать. Большей частью придется посылать комбинации ^знак, но иногда и ^^^знак. Например, если ты после смены местами ^" и ^> сделаешь не так: ^> ^" , а так: ^^^> ^" , то все отлично пройдет конвейер. Поскольку знак > тоже знак перенаправления, как и |, то и обращаться с ним надо соответственно. А когда перед ним были кавычки, конвейер, видимо, решил, что он находится в строке.

Кстати, знак ^ будет экранировать и конец строки, что для echo приведет к забавному результату.

Например, echo aaa ^

bbb

выдаст строку aaa bbb, то есть может быть использовано для продолжения текста в echo в новой строке.

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

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

Вы мужики тут космические разработки ведете :) , а про меня забыли!

Скажите мне если часть пути в батнике из 3 слов, то как ковычки раставлять?

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

Wu-Tang:

если часть пути в батнике из 3 слов, то как ковычки раставлять?

Во-первых, смотря для каких целей. Если ты собрался в этом пути запускать файл через команду start, то тут лучше будет эти три слова сократить - Например, если это такие слова: privet wu tang, тогда сократи так: privet~1.

А если ты указываешь путь к каталогу (к папке), тогда попробуй либо обрамить кавычками эти три слова, либо весь путь.

З.Ы:

Кажется мы это уже проходили... ;)

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

Тролль:

Есть вопрос:

Можно ли запустить батник, в фоновом режиме? Т.е, чтобы окно командного интерпритатора, небыло видно вовсе, в проццесе выполнения сценария.

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

CreatoR:

чтобы окно командного интерпритатора, небыло видно вовсе, в проццесе выполнения сценария
Можно сделать ярлык к батнику, в свойствах которого указываются параметры окна, например, запускать в минимизированном виде, тогда будет видна только полоска свернутого окна в полосе задач. Но свернутое окно неактивно и ввести в него ничего нельзя, если его не развернуть. Есть обходный путь - в свойствах этого ярлыка можно, оставив окну его обычный размер, задать его положение за пределами экрана. Окно останется активным, но невидимым, соответственно клавиатурный ввод оно воспринимать будет. Правда, печатать придется вслепую. Но полоска в полосе задач остается в любом случае.
Ссылка на комментарий
Поделиться на другие сайты

Тролль:

CreatoR:

Можно сделать ярлык к батнику...

А можно ли осуществить это посредствам лишь одного батника? :dontgetit:

Просто для тех целей, к которым я хочю это приминить, запуск ярлыков не совместим (не допустим).

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

CreatoR:

Просто для тех целей, к которым я хочю это приминить, запуск ярлыков не совместим (не допустим).
Опять начинаются какие-то секреты... Почему недопустим?
Ссылка на комментарий
Поделиться на другие сайты

Тролль:

CreatoR: Опять начинаются какие-то секреты... Почему недопустим?

Ну почему секреты. Просто я не хотел рассписывать на пол страницы причину, по которой я не могу запускать ярлык, и также был уставшим немного, извени :blush2: .

-Постараюсь ответить коротко:

Опять же тут крутится всё вокруг Оперы! :g: -Просто надо сделать запуск батника из самой оперы, но чтобы запускался он, в фоновом режиме. А запуск ярлыка, осуществить невозможно, опера не поддерживает запуск такого рода файлов, и при попытке выдаёт ошибку. Вот в сущность и причина, по которой мне нужно чтобы именно батник, не зависимо от ярлыка, выполнял сценарии в фоновом, или пусть даже в свёрнутом режиме.

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

Тролль:

CreatoR:

Так, боюсь, не получится.

Ясно! вопрос исчерпан!

Но вот есть такой вопрос (хотя наверное два): Есть разница между батником, и *.cmd файлом? (с точки зрения использования ими команд).

Если разницы нет (или пусть даже есть, но тогда вопрос для батника), то каким образом, можно задать команду, которая будет проверять наличие всех файлов, с определённым расширением в одной папке, и если это именно эти файлы, то будет выполняться определённое действие (их копирование). Т.е, что то наподобиe этого:

for /f %%I in (folder) do if %%I==*.adr copy *.adr ..\*.adr.

Добавленно:

Извеняюсь за глупый вопрос, я и не подумал (забыл что ли) что такое можно сделать простой командой if exist.

Вопрос на счёт команды снят!

А на счёт разницы между батником и *.cmd, хотел бы всё же уточнить.

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

CreatoR:

Все верно, можно так:

if exist "folder\*.txt" copy "folder\*.txt" ...

Но зачем? Команда copy и так, если есть указанные файлы, скопирует их, если нет - не скопирует. То есть результат не отличается от просто

copy "folder\*.txt" ...

Насчет разницы между bat и cmd.

Разница невелика - различные буквы в расширениях :rolleyes: Хотя это имеет следствие: разный приоритет выбора - если в одной папке есть файлы a.bat и a.cmd и ты наберешь просто a, то выполнится a.bat. Это единственное, что отличает файлы с этими расширениями в Windows XP.

Кроме того, у них разная история: bat пришли из MS-DOS, cmd - из OS-2. Windows XP обрабатывает их одинаково. Два расширения - просто для совместимости, чтобы обрабатывались файлы, взятые и из DOS, и из OS-2, а командный интерпретатор Windows понимает, с некоторыми ограничениями, команды обеих систем.

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

Тролль:

Но зачем?

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

А на счёт разницы, значит с точки зрения исполнения команд, и батник, и файл *.cmd, одинаковы. Но, предподчтение лучше останавливать на батнике, так? Тогда ещё небольшой вопрос: могу ли я запускать файл cmd, командой call с батника, так же как я это делаю с запуском батника, а также создавать его, собирая по кускам текст-файлы, как это делаю с батником? (и затем чтобы он нормально запустился :nerd: ).

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

CreatoR:

Все равно, какое будет расширение у файла - bat или cmd. Для Windows XP это синонимы.

Если не можешь решить, какое расширение дать файлу, подбрось монетку.

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

Например,

copy ... ...

if errorlevel 1 echo Mistake!

Удачному выполнению соответствует код 0.

"Для себя" можно посмотреть выдаваемый командой код по

copy ... ...

echo %errorlevel%

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

Что прописать в батнике чтобы скопировать все содержимое(с каталогами и подкаталогами), например: с дискеты A: на жесткий диск С:?

Пробовал "copy A:\ C:\" - копирует только файлы в корне...

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

Mist:

Привутствую!

Что прописать в батнике чтобы скопировать все содержимое(с каталогами и подкаталогами).

Для того чтобы скопировать всю папку целиком, команда copy не поможет, тебе нужна комада xcopy, и плюс некоторые ключи, которые нужно добовлять после этой команды. Допустим ты хочешь скопировать папку (с её всеми внутриностями) под названием Mist, которая находится на дискете А:\, в диск С:\, то тебе в батнике нужно прописать так:

xcopy /e /i /h /r /y "a:\mist" "c:\mist"

А чтобы скопировать всё содержимое с дисковода, в диск С:\, пропиши команду так:

xcopy /e /i /h /r /y "a:\" "c:\имя_папки"

Если хочешь чтобы батник спрашивал подтверждение перед перезаписью существующего файла, то перед ключём /y поставь '-' (т.е так: /-y). Если хочешь чтобы перед началом всего процесса копирования, батник ждал нажатия клавиши, то добавь ключь /w (ключь добовляй через пробел).

Также подробную справку о команде xcopy, можно узнать зайдя в командный интерпритатор (пуск -> выпoлнить, и вписать cmd), и набрать в нём xcopy /?

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

Mist:

- данные примеры у меня не работают

Скажи, а ты копировал в ту же папку, имя которой на втором примере? (Имя_папки). Если да, то попробуй прописать имя папки с латинскими буквами (с английскими).

Если и так не копируется, то по видимому у тебя что то с командным интерпритатором в виндоусе, или сам файл (батник) не в нужном формате, и повреждён.

Попробуй запустить мой батник который я приложил к этому посту.

xcopy.zip

xcopy.zip

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

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

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



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