Ru-Board.club
← Вернуться в раздел «Программы»

» Командная строка, батники, сценарии (bat, cmd)

Автор: bomzzz
Дата сообщения: 17.09.2009 08:13
гыгы. точно нижние строчки можно /b выкинуть было и верхние
echo off
CD /D %~DP1
DIR %1 /b /a:-d /o:-s >c:\MyList.txt
и всё
Автор: 01MDM
Дата сообщения: 17.09.2009 16:39
bomzzz
Действительно "гыгы". Совсем забыл об обратной сортировке в dir'е. Но для того что бы получить полный путь все равно надо поместить в "for"

Код:
@echo off
cd /d "%~dp1"
for /f "tokens=*" %%i in ('dir /b /a:-d /o:-s') do echo %%~fi 1>>c:\list.txt
Автор: bomzzz
Дата сообщения: 17.09.2009 17:05

точна опять про путь забыл - мне все хотелось с етим фором разобраться и я прогу юзаю FileList, хотелось улучшить

кстати в верхнем посте все строки рабочие и они помогут может быть кому то разобраться как работает FOR
Автор: raystlin
Дата сообщения: 17.09.2009 19:23
01MDM
Спасибо всем огромное. Скрипт работает замечательно.

Насчет кодировки - есть замечательная утилита fdoswin.exe, ей и сковертирую.

Только вот незадача - подкаталоги вместе с файлами в файл filelist.txt не попадают. =(

Получается не так уж скромно...;)
Автор: 01MDM
Дата сообщения: 17.09.2009 19:37
raystlin

Цитата:
Только вот незадача - подкаталоги вместе с файлами в файл filelist.txt не попадают. =(


Цитата:
Насчет кодировки - есть замечательная утилита fdoswin.exe, ей и сковертирую.

Резюме:

Код:
@echo off
chcp 1251 1>nul

cd /d "%~dp1"
for /f "tokens=*" %%i in ('dir /b /a:-d /o:-s /s') do echo %%~fi 1>>c:\list.txt
Автор: bomzzz
Дата сообщения: 17.09.2009 19:45
спасибо - больше часа утром искал что нибудь консольное. кстати алгоритм перекодировки совсем простой.
блин почему все конвертеры µ в ч переводят
Автор: mozers
Дата сообщения: 17.09.2009 20:48
Если уж речь зашла о консольных перекодировщиках, осмелюсь предложить скриптовый вариант: recode.js : [more]
Код: /*
------------------------------------------------
Преобразование текста из одной кодировки в другую
Доступные кодировки:
cp866, windows-1251, koi8, utf-8, ISO_8859-5 и куча других
Полный список перечислен в системном реестре в ключе HKEY_CLASSES_ROOT\MIME\Database\Charset

Пример использования:
type dos866.txt|cscript recode.js cp866 windows-1251 > out.txt
------------------------------------------------
*/

function Recode(text_in, charset_in, charset_out){
with (new
ActiveXObject("ADODB.Stream")) {
Open();
Type = 2;
Charset = charset_out;
WriteText(text_in);
Flush();
Position = 0;
Charset = charset_in;
var
text_out = ReadText(-1);
Close();
}
return
text_out;
}

var
Args = WScript.Arguments;
var
charset_in = Args(0);
var
charset_out = Args(1);

var
text = WScript.StdIn.ReadAll();
text = Recode(text, charset_in, charset_out);
WScript.StdOut.Write(text);
Автор: bomzzz
Дата сообщения: 17.09.2009 20:55
В СМЫСЛЕ ОН ПОТОК УМЕЕТ СРАЗУ ПЕРЕКОДИРОВАТЬ?
Автор: mozers
Дата сообщения: 17.09.2009 21:02
Ну да. А че тут странного?
Автор: bomzzz
Дата сообщения: 17.09.2009 21:10
не знаю - не пробовал еще.

никто не подскажет

Цитата:

читал-писал-стирал вчера реестр, не батниками правда - но не принципиально. с численными и буквенными значениями все нормально, начал бинарные читать - какая то неразбериха - в бинарных записях никакого секрета нету?
длина совпадает, а содержимое не то, какое то или кусок с начала пропадает - не могу понять
Автор: leshiy_odessa
Дата сообщения: 17.09.2009 23:39
Здравствуйте нужна помощь.

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

ex.ua-loader.pl *.avi - залить все файлы с расширением *.avi
ex.ua-loader.pl film.avi - залить файл film.avi

Соответственно когда надо залить не все файлы по маске *.avi приходиться писать .bat файл:

ex.ua-loader.pl film1.avi
ex.ua-loader.pl film2.avi
ex.ua-loader.pl film3.avi

В общем чтобы не напрягаться с командной строкой было решено добавить это в меню по правой кнопки мышки

http://img22.imageshack.us/img22/4364/225119.jpg


Код:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\ЗАЛИТЬ НА EX.UA]

[HKEY_CLASSES_ROOT\*\shell\ЗАЛИТЬ НА EX.UA\command]
@="cmd /c D:\\ex.ua-loader.pl LOGIN PASSWORD 11111 \"%1\" && msg * \"ФАЙЛ ЗАЛИТ\""
Автор: bomzzz
Дата сообщения: 18.09.2009 07:55
консольное окно из за cmd скрипт без cmd наеврно надо запускать

Цитата:

CmdЗапуск нового экземпляра программы командного процессора Cmd.exe.
Заметки
Использование нескольких команд
В параметре строка можно указать несколько команд, используя разделитель команд &&. Однако в этом случае необходимо заключить все эти команды в кавычки (например "команда&&команда&&команда").

START ex.ua-loader.pl film1.avi
Автор: dimpase
Дата сообщения: 18.09.2009 16:11
01MDM

Цитата:
dimpase
Если не ошибаюсь, то этого сделать нельзя в реальном времени. Весь вывод в консоль идет только после того, как команда отработает. Т.е пакетом данных сразу.
пример:

Код:

C:\> for /f "tokens=*" %i in ('ping ya.ru') do @echo %time% %%i


Мне надо чтобы я знал время пинга и задержки.Как это сделать?Извени что пристал

Добавлено:
и чтобы это писалось в файл.
Автор: leshiy_odessa
Дата сообщения: 18.09.2009 18:57

Цитата:
консольное окно из за cmd скрипт без cmd наеврно надо запускать

Цитата:

CmdЗапуск нового экземпляра программы командного процессора Cmd.exe.
Заметки
Использование нескольких команд
В параметре строка можно указать несколько команд, используя разделитель команд &&. Однако в этом случае необходимо заключить все эти команды в кавычки (например "команда&&команда&&команда").


START ex.ua-loader.pl film1.avi


Вы меня не совсем поняли. Есть скрипт который выполняеться по правой кнопке мышки:

cmd /c c:\temp\ex.ua-loader.pl login password ID "%1" && msg * "ФАЙЛ ОТПРАВЛЕН"

Соответственно выделяем несколько файлов мышкой и жмем залить (см. рисунок)

http://img22.imageshack.us/img22/4364/225119.jpg

Что происходит под "%1" подставляются имена выделенных файлов и начинаеться выполнение нескольких скриптов, по числу выделенных файлов

cmd /c c:\temp\ex.ua-loader.pl login password ID 1.avi && msg * "ФАЙЛ ОТПРАВЛЕН"

cmd /c c:\temp\ex.ua-loader.pl login password ID 2.avi && msg * "ФАЙЛ ОТПРАВЛЕН"

cmd /c c:\temp\ex.ua-loader.pl login password ID 3.avi && msg * "ФАЙЛ ОТПРАВЛЕН"

и т.д.

Соответственно открывается столько же окон.

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

К примеру если сделать обычный .bat

cmd /c c:\temp\ex.ua-loader.pl login password ID 1.avi && msg * "ФАЙЛ ОТПРАВЛЕН"
cmd /c c:\temp\ex.ua-loader.pl login password ID 2.avi && msg * "ФАЙЛ ОТПРАВЛЕН"
cmd /c c:\temp\ex.ua-loader.pl login password ID 3.avi && msg * "ФАЙЛ ОТПРАВЛЕН"


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

Этого же я и хочу добиться, но по правой кнопки мышки.

В теории скрипт должен подставить имена файлов, а потом подсовывать их как то.
Или возможно создавать временный .bat файл и запускать его. Правда это не идеальный вариант.
Автор: mozers
Дата сообщения: 18.09.2009 21:32
leshiy_odessa
Цитата:
Соответственно выделяем несколько файлов мышкой и жмем залить
...
подставляются имена выделенных файлов и начинаеться выполнение нескольких скриптов, по числу выделенных файлов
Так и задумано. Чтобы вместо нескольких окон обработка происходила в единственном окне надо сильно мудрить... (В Total Commander это организовать несложно, а вот в Проводнике...)
А можно поступить проще - перенести этот пункт из основного контекстного меню в подпункт "Отправить" (т.е. разместить батник в каталоге c:\Documents and Settings\username\SendTo\) и все заработает как надо. Вот такой батник, к примеру, выведет список выделенных файлов:
Код: @echo off
:loop
if "%1"=="" pause & exit
echo
%1
shift
goto
:loop
Автор: raystlin
Дата сообщения: 18.09.2009 23:00
01MDM
Огромное спасибо...;)
Автор: bomzzz
Дата сообщения: 18.09.2009 23:09
mozers


мне тут стало интересно как добавлять в контекстное меню експлорера, я взял крайне полезную для локалки утилиту http://www.rejetto.com/hfs/, которая туда прописывается, чтоб посматреть где в реестре это делается - она тоже прописывается через shell но консольного окна вообще не возникает.
Автор: leshiy_odessa
Дата сообщения: 20.09.2009 01:50
mozers

Огромное спасибо.

Это практически то что нужно, но теперь хотелось бы чтобы между именами файлов вставлялось - cmd /c c:\temp\ex.ua-loader.pl login password ID <ИМЯ ФАЙЛА> && msg * "ФАЙЛ ОТПРАВЛЕН".

Если в имени файла пробел, то само собой, что не срабатывает.

Я понимаю что наглею, но мне надо пару дней винтиками вертеть, чтобы понять и сделать.

UPDATE

Вариант с SendTo не срабатывает на нескольких файлах. Он отправляет только один и открывает только одно окно.
Автор: bomzzz
Дата сообщения: 20.09.2009 01:59
в кавычки всю строку возьми, с "файл отправлен" не могу точно сказать что делать - пока напиши слитно, может екранировать надо кавычки, а может через & надо делать

@echo off
:loop
if "%1"=="" pause & exit
echo %1
echo "cmd /c c:\temp\ex.ua-loader.pl login password ID %1 && msg * "ФАЙЛОТПРАВЛЕН"">myfile.txt
shift
goto :loop

вот так выпечатывает но в кавычках

еле нашел где у меня send to отключено. выдает все выделенные файлы но вот так
@echo off
:loop
if %1=="" pause & exit
echo %1 >> MyFile.txt
shift
goto :loop

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

понял в чем твоя проблема. отредактировал реестр - просто в контекстное меню добавил, без send to, да возникает множество cmd окон. и даже предупреждение, что до фига. ну не так надо делать. без cmd как то

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

вот когда в TheBat файлы отправляю - никаких окон не возникает.

Цитата:

Иногда перед разработчиком возникает вопрос: как сделать так, чтобы в любой момент у пользователя могло работать не более одного экземпляра приложения. Кроме того, нужно, чтобы при попытке запустить еще один экземпляр этого приложения текущий экземпляр уведомлялся об этом.
Рассмотрим, как можно обеспечить поддержку приложений, запускаемых только в одном экземпляре. Это можно реализовать разными способами. Принцип решения задачи основан на использовании некоего общего ресурса, создаваемого и блокируемого приложением. Если второй экземпляр приложения не может этого сделать, ему известно, что один экземпляр уже существует и работу следует завершить.
Чаще всего общим ресурсом, используемым при создании управляемых приложений, запускаемых только в одном экземпляре, служит мьютекс. Мьютекс - это синхронизирующий примитив, поддерживаемый операционными системами, которые допускают взаимодействие между потоками или процессами. Обычно мьютексы применяют для защиты общих ресурсов, чтобы обеспечить монопольный доступ к ним.

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

в тотал командере есть - копировать имена выделенных файлов

когда копируешь несколько выделенных файлов в буфере обмена естественно не сами копируюца, а только их пути. вот как оттуда их выковыривать. нету штатных средств перевода одного типа информации буфера обмена в другой.

че тут моск парить - папку заведи для файлов на отправку... батник - он список файлов получает и вперед
Автор: mozers
Дата сообщения: 20.09.2009 14:27
leshiy_odessa
1. Чтобы наш пакетник корректно обрабатывал файлы с пробелами в имени/пути надо в операции сравнения заменить кавычки на какие нить другие ограничители.
2. cmd /c или start тут использовать нельзя. Иначе мы нарвемся на то, от чего так упорно убегаем (т.е. при работе пакетника возникнет куча окон по кол-ву выделенных файлов).
Тут надо писать полностью ком.строку для запуска перлового скрипта.
3. Что такое msg * "ФАЙЛ ОТПРАВЛЕН" - я без понятия (утилита какая то?). Думаю вполне достаточно обычного echo.
Сообщение возникнет, только если перловый скрипт вернет 0 (т.е. успешное выполнение).
Если тупой скрипт ничего не возвращает - убери проверку на errorlevel.

В общем, получается так:
Код: @echo off
:loop
if [%1]==[] pause & exit
perl
-w c:\script\ex.ua-loader.pl login password ID "%1"
if not errorlevel 1 echo ФАЙЛ ОТПРАВЛЕН
echo.
shift
goto
:loop
Автор: korosya
Дата сообщения: 20.09.2009 21:18
Подскажите, возможно ли из командной строки изменить версию файла?
Автор: Dr29BArt
Дата сообщения: 20.09.2009 22:45
Помогите написать скриптик. Ззапускается батник с параметром-расширение, нужно подсчитать количество фалов с таким расширением на всех дисках.
Автор: bomzzz
Дата сообщения: 20.09.2009 23:03

Цитата:

ECHO OFF
COLOR 9F
CLS
FOR /R C:\ %%I in (*.txt) DO SET /a COUNT=COUNT+1
ECHO %COUNT%
PAUSE

не знаю как маску делать чтоб на всех дисках искало, ета ищуца все текстовые фалы на диске с
for /r c:\ %%I in (%1) do set /a count=count+1
параметр запуска *.txt
for /r c:\ %%I in (*.%1) do set /a count=count+1
параметр запуска txt

поверхностное прогугливание предлагает перебирать все буквы для дисков
Автор: Artem_Butenko
Дата сообщения: 21.09.2009 09:44
01MDM


Цитата:
Artem_Butenko
1:

Код:
@echo off
for %%i in (*.txt) do call:move "%%i"
goto:eof

:move
set /a folder+=1
md folder
move %1 folder

Автор: 01MDM
Дата сообщения: 21.09.2009 11:29
Artem_Butenko

Код:
@echo off
for %%i in (C:\*.txt) do (
md "C:\%%~ni"
move "%%i" "C:\%%~ni"
)
Автор: Vijkayb
Дата сообщения: 21.09.2009 13:27
Не могу найти в инете, подскажите, возможно ли при помощи батника, перелогинеться в XP, то есть сначала выполнить выход первым пользователем, а потом вход вторым, и как это осуществить?
Автор: bomzzz
Дата сообщения: 21.09.2009 13:34
это головняк будет - после перелогинивая как батник запустить по новой? разве прописать в реестр под админом на автозапуск один раз.
даже не так - надо юзера по умолчанию менять, автологин и перегружаться наверно
Автор: Vijkayb
Дата сообщения: 21.09.2009 14:01
bomzzz

Цитата:
даже не так - надо юзера по умолчанию менять, автологин и перегружаться наверно

Побывал, но мне нужно без перезагрузки – много времени на неё уходи…
Автор: bomzzz
Дата сообщения: 21.09.2009 14:18
а че нельзя от другого юзера ченить поделать? просто у меня один юзер всегда был на компе. можно вроде запускать процессы от друго го юзера
Автор: Vijkayb
Дата сообщения: 21.09.2009 15:10
bomzzz

не вариант ((

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: SAS.Планета (часть 2)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.