на чем лучше написать копирование определенных файлов?
но это скорее всего от неумения писать bat-ники
![](/images/graemlins/smile.gif)
а, ещё на vbs легко пишется наверное.
на WSH
в крайнем случае придется)
а sh-ник для этого вообще приспособлен? именно посчитать сколько файлов в папке, перенести нужное количество с неизвестными именами?
для данной задачи лучше взять wsh(javascript или vscript если, конечно, речь идет о windows.
да,win
никак не называется. Он и так запустится.
Например:
(cd src-dir && (find . -maepth 1 -type f | head -n `expr $(find . -maepth 1 -type f | wc -l) / 3` | tar cfT - - | tar xfC - dest-dir
---
"Аллах не ведёт людей неверных."
ок, пасиб.
ключевые слова:
jscript (или vbscript) operators
FileSystemObject
---
"Аллах не ведёт людей неверных."
Не тебе решать.
пасиб
Мой код уже есть и работает, а виндузятники себя проявили лишь советами.
Ожидать от них кода хотя бы сравнимой длины навряд ли стоит.
---
"Аллах не ведёт людей неверных."
учитель должен лишь указать путь, а ученик уже должен сам по нему пройти
ps
это форум МГУ, а не форум "напишите за меня задачку".
pps
да, и я верю, что Наташа сможет сама разобраться с решением на javascript, в отличие, от чуть более сложного и ресурсоемкого вышеприведенного решения.
Вот если была бы ссылка на примеры решений задач из той же области, я бы посмотрел.
> учитель должен лишь указать путь,
"Аллах не ведёт людей неверных" --- sh.
> а ученик уже должен сам по нему пройти
Эта задача настолько неестественна, что в коде придётся разобраться.
> да, и я верю, что Наташа сможет сама разобраться с решением на javascript,
Ради барахловой задачи изучать яваскрипт?
> в отличие, от чуть более сложного и ресурсоемкого вышеприведенного решения.
Более ресурсоёмкое? Сомнительно.
Более сложное? Наглая ложь.
Ты ещё не привёл решения, следовательно, оно настолько сложно,
что ты не озаботился его написанием.
---
"Аллах не ведёт людей неверных."
> Вот если была бы ссылка на примеры решений задач из той же области, я бы посмотрел.
так открой объект - да посмотри, примеры там есть.
у wsh есть и серьезный недостаток. Официально он не документирован (может, моя инфа устарела). Приходится либо методом тыка, либо юзать книжки - как правило, неструктурированное барахло для ламеров.
что его приводить, если это банальный for
for (int i = 0; i < fileCount/3; ++i)
copyfile(file[i], destDir)
2)с java script я сталкивалась, и написать на нем то что мне нужно может занять порядка получаса
и кстати обсуждение этой темы занимает гораздо больше времени, но более интересно=)
МСДН под рукой нет, зато винда есть.
А на слово я тебе не верю, ты слишком часто всех надуваешь.
---
...Я работаю антинаучным аферистом...
введи это в файл и назови его doubting_thomas.wsh
> 1) разобраться в строчке исходника на shell'e занимается порядка 3 минут,
> что вообщем решает требуемую задачу
"Аллах не ведёт людей неверных."
> и кстати обсуждение этой темы занимает гораздо больше времени, но более интересно=)
Ты решаешь какую-то неестественную задачу, значит,
она получалась дроблением чего-то более привычного.
Думаю, ты хочешь побить каталог на куски, чтобы переслать,
записать на съёмный носитель и т.п.
Обычно это решается совсем другими средствами.
Так что, если это не является тайной, выкладывай полное условие.
---
"Аллах не ведёт людей неверных."
$ cat > doubting_thomas.wsh <<EOF
> for (int i = 0; i < fileCount/3; ++i)
>
> copyfile(file[i], destDir);
> EOF
$
Далее?
---
...Я работаю антинаучным аферистом...
Это sh нечитаемый? Тут кто-то perl упоминал.
Тебе никто не запрещает писать с временными файлами, навроде
TMPFILE=`mktemp -q` || exit 1
или даже с циклами и переменными:
COUNT=0
find ... | while read i; do echo "$i" >> $TMPFILE; COUNT=`expr $COUNT + 1`; done
...
Просто это дольше и муторнее.
---
"Аллах не ведёт людей неверных."
Я, конечно, тупой, но не настолько.
> опустил вычисление переменных file, fileCount и destDir.
Ты думаешь, я мог ожидать чего-то другого?
---
"Аллах не ведёт людей неверных."
OK.
внешнее приложение работает с базой данных, выкидывает кучу файлов в одну папку и последовательно их обрабатывает. Для ускорения запускается несколько приложений, обрабатывающих файлы, а кидать должно только одно - и кидает оно в конкретно заданную папку.
поэтому надо их периодически раскидывать в другие, чтобы другим приложениям было что "съедать"
Это тебе надо не копировать, а перемещать,
то есть вместо связки "tar cf | tar xf" тебе надо "xargs ... mv".
Кроме того, это лучше делать немного по-другому.
Сейчас подумаю.
---
...Я работаю антинаучным аферистом...
vbs
sourceFolder = "p:\\temp"
destFolder = "p:\\temp\\delit\\"
set fso = CreateObject("Scripting.FileSystemObject")
set files = fso.GetFolder(sourceFolder).Files
i = 0
for each file in files
if i > files.Count/3 then exit for
file.Copy(destFolder)
i=i+1
next
js
var sourceFolder = "p:\\temp";
var destFolder = "p:\\temp\\delit\\";
var fso = new ActiveXObject("Scripting.FileSystemObject");
var i = 0;
var files = fso.GetFolder(sourceFolder).Files;
var files_enum = new Enumerator(files);
for (;!files_enum.atEnd;files_enum.moveNext
{
if (i > files.Count/3)
break;
files_enum.item.Copy(destFolder);
i++;
}
find ~ -maepth 1 -type f | while read i; do echo "$i" 1; if read i; then echo "$i" 2; fi; done
Заменить ~ на тот каталог, который надо, и поменять "echo " на "mv" догадаешься?
---
"Аллах не ведёт людей неверных."
sourceFolder = "p:\\temp\\q"
destFolders = Array("p:\\temp\\delit\\1\\", "p:\\temp\\delit\\2\\", "p:\\temp\\delit\\3\\")
set fso = CreateObject("Scripting.FileSystemObject")
set files = fso.GetFolder(sourceFolder).Files
i = LBound(destFolders)
for each file in files
file.Move(destFolders(i
i=i+1
if (i > UBound(destFolders then i = LBound(destFolders)
next
А не полезу я в инет за тем, что должно быть в локальной документации.
Теперь возвращаемся к обсуждению сложности и ресурсоёмкости.
Ты всё ещё будешь утверждать, что хоть какое-нибудь из твоих решений проще моего?
Или менее требовательно?
Что-то я не заметил.
Пока что видно, что:
а) оба решения появились значительно позднее моего;
б) потребовали доступа к Сети, потому что документация почему-то отсутствует на месте;
в) по меньшей мере, втрое длиннее.
Доступ к Сети ты почему-то ресурсом не считаешь.
Да, кстати, инструкции, как запустить, на стол,
я не могу доверять человеку, который постоянно,
как только дело доходит до кода, обманывает,
хочу убедиться самолично.
---
"Аллах не ведёт людей неверных."
инструкции, как запустить, на стол1. даблклик
2. если не сработало, убий сибя апстену
Чего?
Как выясняется, это потребуется запускать по расписанию.
Негром сам будешь или кого-то другого вместо себя пришлёшь?
---
"Аллах не ведёт людей неверных."
первое решение - точно более сложное и ресурсоемкое.
использует двойной проход по списку всех файлов
использует двойное чтение - сначала с диска, потом из pipe-а
второе решение уже чище.
Ps
кстати как твоему решению добавить диагностику ошибок? например, как получить список файлов, которые не скопировались и почему?
заменить догадаюсь, а негром будет cron =)
достаточно оторвать задницу от стула и посмотреть, что происходит, когда ты делаешь double click для данного типа файла.
i=i+1
if (i > UBound(destFolders then i = LBound(destFolders)
Возвращаясь к абстракциям.
Ты хочешь сказать, что вот этот код, который ты привёл,
проще, чем соответствующий со взятием остатка?
---
"Аллах не ведёт людей неверных."
со взятием остатка проще - но мне лень было вспоминать, как в vbs делается взятие остатка.
> первое решение - точно более сложное и ресурсоемкое.
> использует двойной проход по списку всех файлов
И что?
У тебя дискового кеша нет?
У тебя, видимо, нет двойного прохода по списку файлов.
Расскажи, как ты его избежал.
> использует двойное чтение - сначала с диска, потом из pipe-а
Это не требует таких уж огромных ресурсов.
> кстати как твоему решению добавить диагностику ошибок?
> например, как получить список файлов, которые не скопировались и почему?
2>> error.log
---
"Аллах не ведёт людей неверных."
А то ты у нас известный любитель сравнивать работающий код с недокодом.
Я это хорошо помню.
---
"Аллах не ведёт людей неверных."
А, ну да, у виндузятников нет "apropos".
Кстати, ты даже для явы не использовал взятие остатка,
так что отмазка левая: для явы-то не надо было вспоминать,
ты просто не использовал.
---
"Аллах не ведёт людей неверных."
в яве foreach-а нет
и что с ним делать при автоматизации?
через regex парсить?
Ты хочешь сказать, что вот этот код, который ты привёл,По-мне, не то чтобы проще, но гораздо понятнее - соответствует естественному движению "по кругу". Я всегда примерно так пишу.
проще, чем соответствующий со взятием остатка?
cscript q.vbs
Что, в твоём решении это проще?
Что-то я не заметил даже записи в журнал.
---
"Аллах не ведёт людей неверных."
Что-то я не заметил даже записи в журнал.а в твоём скрипте это где?
$ cscript q.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
c:\usr\home\user\q.vbs(1, 33) Microsoft VBScript compilation error: Expected end of statement
---
"Аллах не ведёт людей неверных."
в javascript-е проще - там стандартные exception-ы
в vbs чуть сложнее (т.к. свой синтаксис для обработки ошибок но все равное проще, чем когда используется конвеерная обработка
ps
в исходной программе - не было 33 символов в первой строке.
---
"Аллах не ведёт людей неверных."
use File::Copy;
$d1='/dir1';
$d2='/dir2';
@a=<$d1/*>;
for(@a[0..$#a/3]) {copy($_, $d2)}
Оно лучше КОНТРИного в том смысле, что использует только Перл, без всяких там xargs.
> в javascript-е проще - там стандартные exception-ы
Вылетели по исключению, хвост списка не обработан, простой.
Фигня!
> в vbs чуть сложнее (т.к. свой синтаксис для обработки ошибок
> но все равное проще, чем когда используется конвеерная обработка
Наглая ложь.
Ты не показал даже записи в журнал, из чего я делаю вывод:
это значительно сложнее, чем в моём случае,
ибо ты не стал даже пытаться предложить решение.
---
"Аллах не ведёт людей неверных."
Предложишь объяснение, почему одна программа сработала?
> в исходной программе - не было 33 символов в первой строке.
Меня это не волнует, может, это какой-нибудь препроцессор разделитель строк съел.
Факт остаётся: из предложенных решений работает только одно.
---
"Аллах не ведёт людей неверных."
Ну да?
> use File::Copy;
Одна только перловая библиотека перевесит все xargs вместе взятые.
---
"Аллах не ведёт людей неверных."
Если File::Copy смущает, можно убрать и вместо copy вставить system "cp ... ...".
потому что языки по разному относятся к переводам строк
теперь понятно почему так много "велосипедистов": основная причина - банальное не умение отлаживать чужой код.
С тем же успехом можно иметь установленный MinGW или базовый Cygwin.
> Если File::Copy смущает, можно убрать и вместо copy вставить system "cp ... ..."
Это потребует cp и sh, то есть того же Cygwin или MinGW.
---
"Аллах не ведёт людей неверных."
Если нет cp, пускай будет system("COPY.COM ... ..." или как он там в ДОСе называется.
> теперь понятно почему так много "велосипедистов":
> основная причина - банальное не умение отлаживать чужой код.
От тебя требовалось готовое работающее решение, ты его --- не предоставил.
И теперь все твои дальнейшие измышления отбрасываем,
как основывающиеся на несуществующем решении.
---
"Аллах не ведёт людей неверных."
с system вариант уже нра, только что такое copy.com?
и мне нужно move а не copy,
и еще можно ли уже в таком случае с помощью bat-фала перенести один любой файл? (ну и вставить вызов этого батника в system)
то есть тот же move *.* перенесетт все файлы, а как ограничить их число одной штукой?)
правильный факт: квалификации у тебя хватило только на запуск одного решения.
COPY --- это встроенная команда cmd/command.
Вопросы:
1. Сработает ли system в отсутствие Cygwin/MinGW?
1а. Существует ли такая сборка перла, основывающаяся на среде NT, а не на Cygwin/MinGW?
2. Не возникнет ли проблем с передачей имён файлов, содержащих пробелы?
Это, разумеется, второстепенный вопрос, поскольку навряд ли
промежуточные файлы содержат пробелы в именах.
Хотя... виндузятники и не до такого могут додуматься.
---
...Я работаю антинаучным аферистом...
опять же решение стандартное: перехват exception-ов -надо его только положить на конкретный язык
js
var sourceFolder = "p:\\temp\\z";
var destFolder = "p:\\temp\\delit\\";
var fso = new ActiveXObject("Scripting.FileSystemObject");
var i = 0;
var files = fso.GetFolder(sourceFolder).Files;
var files_enum = new Enumerator(files);
for (;!files_enum.atEnd;files_enum.moveNext
{
try
{
if (i > files.Count/3)
break;
files_enum.item.Copy(destFolder);
i++;
}
catch (e)
{
WScript.StdErr.WriteLine(e.name + " " + e.message + " " + e.description + " " + e.number);
}
}
с вызовом system
>1а. Существует ли такая сборка перла, основывающаяся на среде NT, а не на Cygwin/MinGW?
activestate activeperl
>2. Не возникнет ли проблем с передачей имён файлов, содержащих пробелы?
не возникнет. Если уж возникли, возьми их в кавычки.
>навряд ли
>промежуточные файлы содержат пробелы в именах.
>Хотя... виндузятники и не до такого могут додуматься.
только линуксоеды настолько ущербны, что не могут себе позволить создавать файлы с пробелами в именах?
system("CMD.EXE /непомнюкакойключ COPY /B ... ...").
Но если есть программа COPY.EXE можно обойтись без вызова CMD.EXE.
==
Посмотрел: нет COPY.EXE
![](/images/graemlins/frown.gif)
но проблема остается именно с копированием одного любого файла - мб это просто, но я не знаю как это делается
system("copy 1.htm ..");
copy(..., ...)
system('CMD.EXE', '/ключ', 'COPY', ..., ...)
— проблем с пробелами не будет. Будут проблемы с '/' вместо '\'.
Поскольку решение включало в себя инструкции по его запуску.
Подобные вопросы возникают не первый раз, и в предыдущих случаях
ты показал свои привычки в ответ на работающий код:
а) не давать код;
б) если давать, то полукод, который заранее известно, что не должен работать;
в) если, всё-таки, давать код, то тот, который либо не работает, либо невозможно использовать;
г) подменять задачи.
В этом обсуждении ты показал всё выше перечисленное:
а) после моей публикации кода, твоего ждали очень долго;
б) выбивали, чтобы ты опубликовал код полностью;
в) выбивали инструкции, как запускать;
г) ты стал вилять обработкой ошибок, которой исходно не было в задаче.
Причём:
в') не весь код оказался рабочим;
г') не приведён код, занимающийся обработкой ошибок,
несмотря на то, что мой код --- тривиален и частично приведён.
---
"Аллах не ведёт людей неверных."
имен с пробелами там гарантированно нет
2 : вместо COPY — MOVE (или REN).
если можно сразу system('...
?
$ cscript q.vbs
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
c:\usr\home\user\q.vbs(1, 33) Microsoft VBScript compilation error: Expected end of statement
Твой код --- _не_работает_.
В топку.
---
"Аллах не ведёт людей неверных."
Да, конечно. Я чё-то решил, что без CMD у _НАТАШИ_ не заработало и загрузился. Забыл уже родной ДОС 6.22.
вопрос остался чисто досевый:
какой командой скопировать или переместить, уже не важно один файл?
---
"...Исчезая в этих волнах."
MOVE FILE1 FILE2
![](/images/graemlins/frown.gif)
надо копировать какой-нибудь файл, название которого неизвестно
я сильно сомневаюсь в такой возможности оператора move
![](/images/graemlins/frown.gif)
контру не слушай - он не умеет под windows-ом работать.
на vbs и js нормально пишется, по крайней мере - не хуже, чем на других скриптах.
надо копировать какой-нибудь файл, название которого неизвестновозьми лучше откуда-нибудь его имя, например из параметров
Ты не умеешь решать простейшие задачи под твоей же ОС, а ещё лезешь других учить.
> на vbs и js нормально пишется, по крайней мере - не хуже, чем на других скриптах.
Из всего вышеизложенного легко видеть, что это наглая ложь.
---
"Аллах не ведёт людей неверных."
COPYANY.BAT
===================
COPYONE.BAT C:\DIR1\*.*
===================
COPYONE.BAT
===================
COPY %1 DIR2
===================
Конечно, страшное уродство. К тому же я не уверен, что будет работать, если список *.* будет слишком длинным.
К тому же не возникнет ли проблем, если имя с пробелами? Может, взять %1 в кавычки?
ок, попробую завтра)
Кстати, вот тебе ещё несколько вопросов:
1. Ты будешь работать негром, записывающим то, что убегает в stderr?
Что-то не заметно, чтобы ты этот stderr хоть куда-нибудь перенаправил.
2. Куда девается stderr задач, запущенных из cron?
3. Где твой хвалёный полиморфизм и повторное использование кода?
Ты код поменял почти полностью, это не "old-script 2>>error.log".
---
"Аллах не ведёт людей неверных."
для тупых повторяю по буквам
скопировать код из форума, один в один - с учетом пробелов и переводов строк.
vbs в файл q.vbs, js в файл q.js
запустить cscript q.vbs или cscript q.js
Кстати, не просветит ли меня кто-нибудь: в Виндовс данные, передающиеся по конвейеру, пишутся во временные файлы в %TEMP%, как было в ДОСе, или теперь конвейер настоящий?
> для тупых повторяю по буквам
> vbs в файл q.vbs, js в файл q.js
Это ты только сейчас вспомнил, исходно этого не было.
Но:
>> решение включало в себя инструкции по его запуску.
То есть сейчас ты даёшь другое решение.
> запустить cscript q.vbs или cscript q.js
---
"Аллах не ведёт людей неверных."
кончай тупить
твое решение кстати тоже не запускается, и инструкцию по запуску я не вижу
/ was unexpected at this time.
Просто не надо давать заведомо ложные утверждения,
будто бейсик или яваскрипт хоть сколь-либо пригодны
для автоматизации такого рода.
А то, что пропускает такие очевидные вещи,
это всего лишь свидетельство его низкой квалификации.
---
"Аллах не ведёт людей неверных."
а питон? на нём тоже просто написать... Только с виндой он не идёт
А ты её только сейчас и спросил.
Запустить bash из Cygwin с установленными штатным образом bash, findutils и coreutils,
скормить ему текст, нажать "Enter".
---
"Аллах не ведёт людей неверных."
Если просто, то где решение?
---
"Аллах не ведёт людей неверных."
где в исходной постановке от тебя - написано, что stderr не является журналом?
> 3. Где твой хвалёный полиморфизм и повторное использование кода?
да, javascript не поддерживает централизованной обработки ошибок.
кстати в sh тоже нет централизованной обработки ошибок
_________________
import glob, shutil, sys, os
assert len(sys.argv) == 3;
files = glob.glob(os.path.join(sys.argv[1], '*'
if not os.path.exists(sys.argv[2]):
os.mkdir(sys.argv[2])
for every_third_file in filter(
lambda file: files.index(file) % 3 == 0, files
):
shutil.move(every_third_file, sys.argv[2])
________________
python cp.py src dst
сложность O(N^2) - на кол-ве файлов больше 10-100 тыс. будут заметны тормоза.
можно простой счётчик
assert len(sys.argv) == 3;
if not os.path.exists(sys.argv[2]):
os.mkdir(sys.argv[2])
cnt = 0;
for file in glob.glob(os.path.join(sys.argv[1], '*':
if(cnt % 3 == 0):
shutil.move(file, sys.argv[2])
cnt += 1
> где в исходной постановке от тебя - написано, что stderr не является журналом?
Негром будешь ты работать?
Всё, что ты смог, это очень плохо воспроизвести первые мои скрипты,
которые нисколько не заботились об ошибках, никуда их не сохраняя.
>> 3. Где твой хвалёный полиморфизм и повторное использование кода?
> да, javascript не поддерживает централизованной обработки ошибок.
Речь не о централизованной обработке ошибок, а о повторном использовании кода.
Для того, чтобы добавить запись ошибок в stderr, тебе пришлось переворошить почти весь код.
Хочешь сказать, это хорошо?
Это --- отстой, почти нулевое повторное использование кода.
Процедурное замечание.
То, что ты заговорил не о повторном использовании кода, а об обработке исключений,
ещё раз показывает, что ты очень любишь подменять условия задачи,
отвечать не на поставленные вопросы, а на те, которые удобны тебе.
Я тебе дал дополнительное разъяснение по поставленному мной вопросу,
а ты его, судя по ответу, даже не удосужился прочитать.
Хочешь сказать, что тебя после такого можно принимать хоть сколь-нибудь серьёзно?
А ведь ты ещё строишь из себя высококвалифицированного профессионала.
---
"Истина грядёт --- её ничто не остановит!"
демагогией занимаешься
да, javascript не умеют сам по себе skip-ать ошибки.
да, sh не умеет обрабатывать ошибки ювелирно.
Соответственно первый удобнее на задачах - когда нам нужен контроль за ошибками, второй удобнее - когда нам просто что-то надо сделать.
соответственно первый удобнее - при автоматизации, которая работает постоянно, второй удобнее - при автоматизации здесь и сейчас.
Да, текущие инструменты не совершенны.
какое это отношение имеет к стремлению разрабатывать программы полиморфно (с подсистемами, которые ортогональный друг другу)?
>> да, javascript не поддерживает централизованной обработки ошибок.
>>Речь не о централизованной обработке ошибок, а о повторном использовании кода.
>>...
>>То, что ты заговорил не о повторном использовании кода, а об обработке исключений,
окстись, какие еще exception-ы?
я только заметил, что и там, и там - обработка ошибок не является ортогональной (полиморфной) по отношению к остальному коду.
А не полезу я в инет за тем, что должно быть в локальной документации.У нормальных людей это есть в локальной документации
б) потребовали доступа к Сети, потому что документация почему-то отсутствует на месте;
![](/images/graemlins/smile.gif)
Start -> All Programs -> Microsoft Developer Network -> MSDN Library for Visual Studio 2005
![](/images/graemlins/laugh.gif)
Пока что видно, что:Пока что видно, что:
а) оба решения появились значительно позднее моего;
б) потребовали доступа к Сети, потому что документация почему-то отсутствует на месте;
в) по меньшей мере, втрое длиннее.
а) твоё решение не решает поставленную задачу (советую внимательно перечитать первый пост)
б) на твоей конкретной отдельно взятой винде проблемы с документацией, так как ты её почему-то не установил
P.S.
![](/images/graemlins/smile.gif)
> демагогией занимаешься
Если ты не знаешь смысла слов, которые произносишь, пользуйся словарём.
> да, javascript не умеют сам по себе skip-ать ошибки.
> да, sh не умеет обрабатывать ошибки ювелирно.
> Соответственно первый удобнее на задачах - когда нам нужен контроль за ошибками,
> второй удобнее - когда нам просто что-то надо сделать.
> соответственно первый удобнее - при автоматизации, которая работает постоянно,
> второй удобнее - при автоматизации здесь и сейчас.
Из вышеизложенного видно, что яваскрипт ни на что не годится,
потому что ты не можешь грамотно справиться с обработкой ошибок.
> Да, текущие инструменты не совершенны.
Ты сейчас о чём говоришь?
Пытаешься отвлечь внимание от того простого факта,
что ты не смог справиться даже с поставленной задачей
и достичь уровня программинования того же sh?
> какое это отношение имеет к стремлению разрабатывать программы полиморфно
> (с подсистемами, которые ортогональный друг другу)?
Это --- никакого, но ты показал нулевые возможности повторного использования кода.
Почему? Объяснение простое.
Потому что яваскрипт _не_поддерживает_повторное_использование_кода_.
Ибо если б он поддерживал, ты не стал бы ворошить весь код,
вставляя вывод сообщения об ошибке.
Ты сработал как обычный насильник, причём очень плохой насильник,
потому что уже давно никто не использует printf ---
для вывода такого рода сообщений существуют err/warn.
>>> да, javascript не поддерживает централизованной обработки ошибок.
>>Речь не о централизованной обработке ошибок, а о повторном использовании кода.
>>...
>>То, что ты заговорил не о повторном использовании кода, а об обработке исключений,
> окстись, какие еще exception-ы?
Ещё раз прочитай твои собственные слова:
>>> да, javascript не поддерживает централизованной обработки ошибок.
И, кстати, не надо подменять слова: я сказал "исключения", а не "exception"-ы.
Разницу видишь?
Если нет, что нисколько не удивительно, то поясняю:
исключение --- это не только "exception", исключение --- это любой исключительный случай,
требующий отдельной обработки, в отличие от "exception",
которое здесь несёт исключительно технический или даже технологический смысл.
> я только заметил,
Ты не только этого не заметил, но преднамеренно лжёшь.
> что и там, и там - обработка ошибок не является ортогональной (полиморфной)
> по отношению к остальному коду.
1. "Ортогональность" и "полиморфность" --- это совсем разные понятия,
друг с другом не связанные.
2. В отличие от яваскрипта, в sh обработка ошибок полностью ортогональна:
она использует имеющийся код почти без изменений.
Не надо ворошить весь код, как это сделал ты в случае яваскрипта,
для того, чтобы обрабатывать ошибки.
---
"Аллах не ведёт людей неверных."
То есть, документация идёт:
а) даже не самостоятельным пакетом, а в составе третьего продукта;
б) документации в штатной установке всё равно нет.
Я понимаю, что при некотором желании я могу установить sh без документации,
вот только это --- увы-
...Я работаю антинаучным аферистом...
Я с самого начала в курсе.
Просто Cygwin --- это must, его не просто полезно, а почти что необходимо иметь уже установленным.
Я с самого начала думал, что по затратам дискового пространства решение на Cygwin будет лёгче перлового.
В отличие от , я изменяю условия задачи в полезную сторону.
---
"Аллах не ведёт людей неверных."
Полезную для кого/чего?
То есть, документация идёт:ИМХО документация идёт в составе Platform SDK, который загружается бесплатно без всяких третьих продуктов. Cygwin на винде - ещё менее штатная хрень, чем Platform SDK.
а) даже не самостоятельным пакетом, а в составе третьего продукта;
б) документации в штатной установке всё равно нет.
---
"Аллах не ведёт людей неверных."
> она использует имеющийся код почти без изменений.
> Не надо ворошить весь код, как это сделал ты в случае яваскрипта,
> для того, чтобы обрабатывать ошибки.
вот здесь ты себя обманываешь.
добавь пожалуйста к своей задаче следующий функционал:
1. если не получилось получить информацию о файле или скопировать файл - то попробовать операцию еще раз, но не более 3-х
2. если не получилось подряд скопировать (или получить инфу) 10 файлов - то прекратить выполнение задачи.
вот если в sh - действительно обработка ошибок ортогональна по отношению к самой задаче, то ты нам сейчас за пару минут сможешь продемонстрировать решение.
зачем мне это делать?
в постановке задач - про обработку ошибок, вообще, речь не шла.
то что твое решение ошибки "съедает" - совсем не означает, что так надо делать и в реальной задаче тоже.
единственное - что я сделал - это показал, как при необходимости - эту обработку можно добавить
>> а) даже не самостоятельным пакетом, а в составе третьего продукта;
>> б) документации в штатной установке всё равно нет.
> ИМХО
То есть, ты сам до конца не уверен.
> документация идёт в составе Platform SDK, который загружается бесплатно без всяких третьих продуктов.
Это сам по себе третий продукт.
> Cygwin на винде - ещё менее штатная хрень, чем Platform SDK.
С этим можно поспорить, но мне уже лень.
Я не могу считать полезными языки программирования, вся ценность которых
заключена в их происхождении из недр "Микрософта" или "Сана."
---
"Аллах не ведёт людей неверных."
Я не могу считать полезными языки программирования, вся ценность которыхЕсли ты про Джаваскрипт, то гы, лол.
заключена в их происхождении из недр "Микрософта" или "Сана."
Чё лол-то, мискрософт использует свою реализацию JavaScript, которая и называется-то JScript, а не JavaScript, как исходный нетскейповский продукт.
разве есть серьезные отличия? (если, конечно, не брать jscript.net)
![](/images/graemlins/smile.gif)
Я в курсе, если что. Это Кохтпа не в курсе.
>> она использует имеющийся код почти без изменений.
>> Не надо ворошить весь код, как это сделал ты в случае яваскрипта,
>> для того, чтобы обрабатывать ошибки.
> вот здесь ты себя обманываешь.
> добавь пожалуйста к своей задаче следующий функционал:
Предложенный функционал не имеет смысла в условиях задачи,
так что добавлять его я не буду.
Если ты любишь заниматься решением оторванных от жизни задач, то пожалуйста!
Но не надо привлекать к этому ещё и меня.
То, что ты предложил добавлять эти из пальца высосанные возможности,
означает, что ты видишь, как их легко добавить.
Несмотря на то, что тебе придётся переворошить весь код,
то есть исходная критика остаётся в силе.
Опять хочешь почувствовать себя героем?
> 1. если не получилось получить информацию о файле или скопировать файл -
> то попробовать операцию еще раз, но не более 3-х
Ну-ка, расскажи, зачем это делать, если скрипт вызывается периодически.
> 2. если не получилось подряд скопировать (или получить инфу) 10 файлов - то прекратить выполнение задачи.
В этом смысла ещё меньше: перемещение в пределах одной файловой системы ---
малозатратно и не требует лишних ресурсов,
перемещение в другую файловую систему более затратно по времени,
но освобождает ресурсы памяти. Нафига останавливать раздачу?
Если раздачу всё-таки надо останавливать, то этим должны заниматься потребители,
которым может не хватать памяти.
Но это уже вопрос взаимодействия потребителей и производителя,
никаким образом не вовлекающий раздатчика.
> вот если в sh - действительно обработка ошибок ортогональна по отношению к самой задаче,
> то ты нам сейчас за пару минут сможешь продемонстрировать решение.
Давай так: ты считаешь себя героем, но ещё ничего не показал,
пары минут тебе не хватит, поэтому я согласен на двадцать.
Тебе выдаётся двадцать минут, а ты, _считая_твой_первоначальный_код_,
который неперелопаченный, _неприкосновенным_,
показываешь, как ты --- полиморфно или любым другим внешним образом ---
добавляешь журналирование ошибок.
Изменять первоначальный файл --- запрещается,
писать внешний функционал основной задачи --- тоже.
После этого я посмотрю, имеет ли смысл показывать тебе,
как решать твои высосанные из пальца задачи.
---
"Аллах не ведёт людей неверных."
> зачем мне это делать?
Чтобы хоть сколько-нибудь подтвердить твою квалификацию, которая пока что никакая.
> в постановке задач - про обработку ошибок, вообще, речь не шла.
То есть теперь, когда тебя припёрли, ты признаёшь, что подменял условия.
> то что твое решение ошибки "съедает" - совсем не означает,
С чего это ты взял, что оно их съедает?
Оно их просто обрабатывает оповещением пользователя:
что, мол, были ошибки, не удивляйтесь, если что --- список.
> единственное - что я сделал - это показал, как при необходимости - эту обработку можно добавить
Ту, которая в моём решении шла изначально, да ещё и кривым способом.
---
"Аллах не ведёт людей неверных."
---
"Истина грядёт --- её ничто не остановит!"
set SRC_DIR=dir1
set DST_DIR=dir2
set DIR_CMD=dir %SRC_DIR%\*.* /a:-d /b
for /f %%i in ('%DIR_CMD% | find "" /v /c') set /a FILE_COUNT=%%i/3
set FILE_IDX=0
for /f "tokens=*" %%i in ('%DIR_CMD%') call :copyfile "%%i"
goto :EOF
:copyfile
set /a FILE_IDX=FILE_IDX+1
if %FILE_IDX% GTR %FILE_COUNT% goto :EOF
copy "%SRC_DIR%\%~1" "%DST_DIR%\"
goto :EOF
в самом языке изменения есть?
> А то, чем ты пользуешься
про то, что ты говоришь - там добавлены только несколько доп. классов - но к самому языку это не имеет отношение, также как добавление доп. классы в Ajax-е, firefox-е и т.д.
если узко мыслить - то да.
> Ну-ка, расскажи, зачем это делать, если скрипт вызывается периодически.
в первую очередь - для того, чтобы показать ортогональную обработку ошибок, про которую ты так хвалился постом выше.
если по задаче - то такое может быть необходимо, если нужна последовательная обработка файлов.
> В этом смысла ещё меньше: перемещение в пределах одной файловой системы ---
перекидывание может происходит между машинами.
может запускаться резервная задача, которая эти же файлы перекидывает через другой канал.
> Если раздачу всё-таки надо останавливать, то этим должны заниматься потребители,
> которым может не хватать памяти.
так покажи, как они, благодаря ортогональной обработки ошибок в sh, смогут диагностировать данную ситуацию, и остановить задачу.
> который неперелопаченный, _неприкосновенным_,
js
var errout = WScript.StdErr;
function WriteError(error)
{
errout.WriteLine(error.message);
}
var fso, f;
var ForReading = 1, ForWriting = 2;
fso = new ActiveXObject("Scripting.FileSystemObject");
f = fso.OpenTextFile("q.js", ForReading);
var js = f.ReadAll;
var prefix = "{try{";
var suffix = "}catch(e){WriteError(e);} }";
eval(prefix + js.replace("{", prefix).replace("}", suffix) + suffix);
сделать, чтобы в errout был тот стрим, который ты называешь журналом - сможешь?
$ cat q{1,2}* | sort | uniq -c
6
1 errout.WriteLine(error.message);
1 eval(prefix + js.replace("{", prefix).replace("}", suffix) + suffix);
1 f = fso.OpenTextFile("q.js", ForReading);
1 for (;!files_enum.atEnd;files_enum.moveNext
1 fso = new ActiveXObject("Scripting.FileSystemObject");
1 function WriteError(error)
1 var ForReading = 1, ForWriting = 2;
1 var destFolder = "p:\\temp\\delit\\";
1 var errout = WScript.StdErr;
1 var files = fso.GetFolder(sourceFolder).Files;
1 var files_enum = new Enumerator(files);
1 var fso = new ActiveXObject("Scripting.FileSystemObject");
1 var fso, f;
1 var i = 0;
1 var js = f.ReadAll;
1 var prefix = "{try{";
1 var sourceFolder = "p:\\temp";
1 var suffix = "}catch(e){WriteError(e);} }";
2 {
2 }
1 files_enum.item.Copy(destFolder);
1 i++;
1 if (i > files.Count/3)
1 break;
И кого ты хочешь надуть?
---
"Аллах не ведёт людей неверных."
ты какие-то на ходу новые требования выдвигаешь непонятно зачем.
исходный код менялся?
повторение исходного функционала есть?
---
"Аллах не ведёт людей неверных."
в каком это месте?
q.js - как был, так и остался без изменений.
$ wc q{1,2}*
16 37 383 q1.js
16 47 417 q2.js
Легко видеть, что исходные тексты сравнимы по объёму,
то есть, по-прежнему, повторное использование кода --- никакое.
По качеству.
С тем же успехом можно было бы написать программу
cat > q.js <<EOF
...
EOF
---
...Я работаю антинаучным аферистом...
это ты уже прикапываешься, и на ходу подменяешь условия задачи.
> То есть, ты сам до конца не уверен
Чтоб ты знал, ИМХО на русский переводится как "по моему мнению" или "по моему скромному мнению", а не "до конца не уверен". Если б я был не уверен, я бы написал AFAIK.
> > документация идёт в составе Platform SDK, который загружается бесплатно без всяких третьих продуктов.
> Это сам по себе третий продукт.
А заголовочные файлы и маны в линуксе или FreeBSD - это как, третий продукт?
![](/images/graemlins/lol.gif)
Где в исходной постановке про это шла речь?
опять на ходу меняешь условия.
old-script
Ты, кстати, так и не озаботился перенаправлением в файл.
Как у тебя обстоит дело с кроном? Куда он девает stderr и stdout?
---
...Я работаю антинаучным аферистом...
>> Это сам по себе третий продукт.
> А заголовочные файлы и маны в линуксе или FreeBSD - это как, третий продукт?
Линукс вообще не ОС, а в БСД они ставятся с того же носителя.
---
"Аллах не ведёт людей неверных."
ты сообщения читаешь прежде чем ответишь? а прочитанный текст обдумываешь?
сделать, чтобы в errout был тот стрим, который ты называешь журналом - сможешь?> Как у тебя обстоит дело с кроном? Куда он девает stderr и stdout?
куда ему скажешь перенаправить - туда и денет.
$ man logger | head
LOGGER(1) BSD General Commands Manual LOGGER(1)
NAME
logger - a shell command interface to the syslog(3) system log module
SYNOPSIS
logger [-isd] [-f file] [-p pri] [-t tag] [-u socket] [message ...]
DESCRIPTION
Logger makes entries in the system log. It provides a shell command
$ uname
CYGWIN_NT-5.1
Только ты даже просто в файл не можешь направить.
Что-то я от тебя этого уже целый день не могу добиться.
>> Как у тебя обстоит дело с кроном? Куда он девает stderr и stdout?
> куда ему скажешь перенаправить - туда и денет.
Вот и перенаправь!
---
"Аллах не ведёт людей неверных."
не работает=)
![](/images/graemlins/grin.gif)
Запускать так (Windows):
set I=0
for %%x in (%1\*) do (
if !I!==1 set I=0
if !I!==2 set I=1
if !I!==3 set I=2
if !I!==0 move %%x %2
if !I!==0 set I=3
)
cmd /Q /V:ON /C mv.bat dir1 dir2переносит ~треть файлов из dir1 в dir2.
![](/images/graemlins/smile.gif)
а что именно?
![](/images/graemlins/smile.gif)
утром попробую
по поводу 3 строчки вроде)
2)не работает=)
3)идея понятна, если все форы выразить через готу, или пересмотреть синтаксис форов...
по крайней мере читабельно
Может еще и от операционки сильно зависит - не знаю. Но у меня все работает на ура
![](/images/graemlins/smile.gif)
всем)
Оставить комментарий
bjc2
на чем лучше всего написать маленький скриптик, копирующий ровно треть любых файлов из конкретной папки в другую конкретную папку? Сколько файлов на данный момент в папке, неизвестно.можно ли написать такой bat-ник?
з.ы.:преимущество отдается языкам, не требующим компиляци=) масимум, в каталог со скриптиком можно положить файл типа perl.exe, с помощью которого он будет работать