на чем лучше написать копирование определенных файлов?

bjc2

на чем лучше всего написать маленький скриптик, копирующий ровно треть любых файлов из конкретной папки в другую конкретную папку? Сколько файлов на данный момент в папке, неизвестно.
можно ли написать такой bat-ник?
з.ы.:преимущество отдается языкам, не требующим компиляци=) масимум, в каталог со скриптиком можно положить файл типа perl.exe, с помощью которого он будет работать

ava3443

я бы на awk или sh написал - рядом надо будет положить awk.exe или sh.exe соответственно.
но это скорее всего от неумения писать bat-ники
а, ещё на vbs легко пишется наверное.

maggi14

на WSH

bjc2

я тогда подожду, вдруг кто-нить знает, и все-таки можно bat написать:)
в крайнем случае придется)
а sh-ник для этого вообще приспособлен? именно посчитать сколько файлов в папке, перенести нужное количество с неизвестными именами?

Dasar

на bat-е можно - но долго и глючно
для данной задачи лучше взять wsh(javascript или vscript если, конечно, речь идет о windows.

bjc2

тогда, пожалуйста, если есть, киньте ссылку на какой-нить справочник операторов языка=) ну или любой толковый хелп! И как называется файлик exe, который надо к нему приложить?
да,win

maggi14

никак не называется. Он и так запустится.

Ivan8209

sh, find, expr, head, pax/tar/xargs+cp
Например:

(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

---
"Аллах не ведёт людей неверных."

bjc2

ок, пасиб.

Dasar

msdn.microsoft.com
ключевые слова:
jscript (или vbscript) operators
FileSystemObject

Ivan8209

Виндузятники, как обычно, сели на простейшей задаче.
---
"Аллах не ведёт людей неверных."

Elina74

Не тебе решать.

bjc2

вау=)
пасиб

Ivan8209

Именно что мне.
Мой код уже есть и работает, а виндузятники себя проявили лишь советами.
Ожидать от них кода хотя бы сравнимой длины навряд ли стоит.
---
"Аллах не ведёт людей неверных."

Dasar

ты неправильно ведешь себя с учащимися.
учитель должен лишь указать путь, а ученик уже должен сам по нему пройти
ps
это форум МГУ, а не форум "напишите за меня задачку".
pps
да, и я верю, что Наташа сможет сама разобраться с решением на javascript, в отличие, от чуть более сложного и ресурсоемкого вышеприведенного решения.

Marinavo_0507

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

Ivan8209

> ты неправильно ведешь себя с учащимися.
> учитель должен лишь указать путь,
"Аллах не ведёт людей неверных" --- sh.
> а ученик уже должен сам по нему пройти
Эта задача настолько неестественна, что в коде придётся разобраться.
> да, и я верю, что Наташа сможет сама разобраться с решением на javascript,
Ради барахловой задачи изучать яваскрипт?
> в отличие, от чуть более сложного и ресурсоемкого вышеприведенного решения.
Более ресурсоёмкое? Сомнительно.
Более сложное? Наглая ложь.
Ты ещё не привёл решения, следовательно, оно настолько сложно,
что ты не озаботился его написанием.
---
"Аллах не ведёт людей неверных."

Dasar

> Так что один объект я увижу, а вот что с ним делать - не пойму.
> Вот если была бы ссылка на примеры решений задач из той же области, я бы посмотрел.
так открой объект - да посмотри, примеры там есть.

maggi14

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

Dasar

> Ты ещё не привёл решения, следовательно, оно настолько сложно, что ты не озаботился его написанием.
что его приводить, если это банальный for

for (int i = 0; i < fileCount/3; ++i)
  copyfile(file[i], destDir)

bjc2

ну вообще говоря, оба варианта были приемлемы, потому что 1)разобраться в строчке исходника на shell'e занимается порядка 3 минут, что вообщем решает требуемую задачу
2)с java script я сталкивалась, и написать на нем то что мне нужно может занять порядка получаса
и кстати обсуждение этой темы занимает гораздо больше времени, но более интересно=)

Ivan8209

Ну-ка, выдай инструкции, куда я могу скормить твой код, чтобы проверить.
МСДН под рукой нет, зато винда есть.
А на слово я тебе не верю, ты слишком часто всех надуваешь.
---
...Я работаю антинаучным аферистом...

maggi14

введи это в файл и назови его doubting_thomas.wsh

Ivan8209

> ну вообще говоря, оба варианта были приемлемы, потому что
> 1) разобраться в строчке исходника на shell'e занимается порядка 3 минут,
> что вообщем решает требуемую задачу
"Аллах не ведёт людей неверных."
> и кстати обсуждение этой темы занимает гораздо больше времени, но более интересно=)
Ты решаешь какую-то неестественную задачу, значит,
она получалась дроблением чего-то более привычного.
Думаю, ты хочешь побить каталог на куски, чтобы переслать,
записать на съёмный носитель и т.п.
Обычно это решается совсем другими средствами.
Так что, если это не является тайной, выкладывай полное условие.
---
"Аллах не ведёт людей неверных."

Ivan8209


$ cat > doubting_thomas.wsh <<EOF
> for (int i = 0; i < fileCount/3; ++i)
>
>   copyfile(file[i], destDir);
> EOF
$

Далее?
---
...Я работаю антинаучным аферистом...

bobby

Уверяю тебя, этот отрывок не будет работать так, как требуется
опустил вычисление переменных file, fileCount и destDir.

Ivan8209

> у wsh есть один сильный плюс на фоне sh - там весьма нечитабельный язык.
Это sh нечитаемый? Тут кто-то perl упоминал.
Тебе никто не запрещает писать с временными файлами, навроде

TMPFILE=`mktemp -q` || exit 1

или даже с циклами и переменными:

COUNT=0
find ... | while read i; do echo "$i" >> $TMPFILE; COUNT=`expr $COUNT + 1`; done
...

Просто это дольше и муторнее.
---
"Аллах не ведёт людей неверных."

Ivan8209

> Уверяю тебя, этот отрывок не будет работать так, как требуется
Я, конечно, тупой, но не настолько.
> опустил вычисление переменных file, fileCount и destDir.
Ты думаешь, я мог ожидать чего-то другого?
---
"Аллах не ведёт людей неверных."

bobby

OK.

bjc2

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

Ivan8209

Э!
Это тебе надо не копировать, а перемещать,
то есть вместо связки "tar cf | tar xf" тебе надо "xargs ... mv".
Кроме того, это лучше делать немного по-другому.
Сейчас подумаю.
---
...Я работаю антинаучным аферистом...

Dasar

мог бы и в инет залезть, чтобы посмотреть какие эти проперти получить
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++;
}

Ivan8209


find ~ -maepth 1 -type f | while read i; do echo "$i" 1; if read i; then echo "$i" 2; fi; done

Заменить ~ на тот каталог, который надо, и поменять "echo " на "mv" догадаешься?
---
"Аллах не ведёт людей неверных."

Dasar

кстати модифицируется он под новую задачу просто

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

Ivan8209

> мог бы и в инет залезть
А не полезу я в инет за тем, что должно быть в локальной документации.
Теперь возвращаемся к обсуждению сложности и ресурсоёмкости.
Ты всё ещё будешь утверждать, что хоть какое-нибудь из твоих решений проще моего?
Или менее требовательно?
Что-то я не заметил.
Пока что видно, что:
а) оба решения появились значительно позднее моего;
б) потребовали доступа к Сети, потому что документация почему-то отсутствует на месте;
в) по меньшей мере, втрое длиннее.
Доступ к Сети ты почему-то ресурсом не считаешь.
Да, кстати, инструкции, как запустить, на стол,
я не могу доверять человеку, который постоянно,
как только дело доходит до кода, обманывает,
хочу убедиться самолично.
---
"Аллах не ведёт людей неверных."

Elina74

инструкции, как запустить, на стол
1. даблклик
2. если не сработало, убий сибя апстену

Ivan8209

> 1. даблклик
Чего?
Как выясняется, это потребуется запускать по расписанию.
Негром сам будешь или кого-то другого вместо себя пришлёшь?
---
"Аллах не ведёт людей неверных."

Dasar

> Ты всё ещё будешь утверждать, что хоть какое-нибудь из твоих решений проще моего?
первое решение - точно более сложное и ресурсоемкое.
использует двойной проход по списку всех файлов
использует двойное чтение - сначала с диска, потом из pipe-а
второе решение уже чище.
Ps
кстати как твоему решению добавить диагностику ошибок? например, как получить список файлов, которые не скопировались и почему?

bjc2

заменить догадаюсь, а негром будет cron =)

Dasar

> Негром сам будешь или кого-то другого вместо себя пришлёшь?
достаточно оторвать задницу от стула и посмотреть, что происходит, когда ты делаешь double click для данного типа файла.

Ivan8209

Прикольно!

  i=i+1
  if (i > UBound(destFolders then i = LBound(destFolders)

Возвращаясь к абстракциям.
Ты хочешь сказать, что вот этот код, который ты привёл,
проще, чем соответствующий со взятием остатка?
---
"Аллах не ведёт людей неверных."

Dasar

со взятием остатка проще - но мне лень было вспоминать, как в vbs делается взятие остатка.

Ivan8209

>> Ты всё ещё будешь утверждать, что хоть какое-нибудь из твоих решений проще моего?

> первое решение - точно более сложное и ресурсоемкое.
> использует двойной проход по списку всех файлов
И что?
У тебя дискового кеша нет?
У тебя, видимо, нет двойного прохода по списку файлов.
Расскажи, как ты его избежал.
> использует двойное чтение - сначала с диска, потом из pipe-а
Это не требует таких уж огромных ресурсов.
> кстати как твоему решению добавить диагностику ошибок?
> например, как получить список файлов, которые не скопировались и почему?
2>> error.log
---
"Аллах не ведёт людей неверных."

Ivan8209

Ты не отвлекайся, твоё решение не засчитывается до изложения инструкций в письменном виде.
А то ты у нас известный любитель сравнивать работающий код с недокодом.
Я это хорошо помню.
---
"Аллах не ведёт людей неверных."

Ivan8209

> мне лень было вспоминать, как в vbs делается взятие остатка.
А, ну да, у виндузятников нет "apropos".
Кстати, ты даже для явы не использовал взятие остатка,
так что отмазка левая: для явы-то не надо было вспоминать,
ты просто не использовал.
---
"Аллах не ведёт людей неверных."

Dasar

в яве foreach-а нет

Dasar

> 2>> error.log
и что с ним делать при автоматизации?
через regex парсить?

Marinavo_0507

Ты хочешь сказать, что вот этот код, который ты привёл,
проще, чем соответствующий со взятием остатка?
По-мне, не то чтобы проще, но гораздо понятнее - соответствует естественному движению "по кругу". Я всегда примерно так пишу.

Dasar

> Ты не отвлекайся, твоё решение не засчитывается до изложения инструкций в письменном виде.
cscript q.vbs

Ivan8209

Начинаешь подменять задачу?
Что, в твоём решении это проще?
Что-то я не заметил даже записи в журнал.
---
"Аллах не ведёт людей неверных."

Elina74

Что-то я не заметил даже записи в журнал.
а в твоём скрипте это где?

Ivan8209

Одно решение зачтено:

$ 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

---
"Аллах не ведёт людей неверных."

Dasar

> Что, в твоём решении это проще?
в javascript-е проще - там стандартные exception-ы
в vbs чуть сложнее (т.к. свой синтаксис для обработки ошибок но все равное проще, чем когда используется конвеерная обработка

Dasar

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

Ivan8209

Вот .
---
"Аллах не ведёт людей неверных."

sany79

_НАТАША_, зацени моё решение на Перле:

use File::Copy;
$d1='/dir1';
$d2='/dir2';
@a=<$d1/*>;
for(@a[0..$#a/3]) {copy($_, $d2)}

Оно лучше КОНТРИного в том смысле, что использует только Перл, без всяких там xargs.

Ivan8209

>> Что, в твоём решении это проще?
> в javascript-е проще - там стандартные exception-ы
Вылетели по исключению, хвост списка не обработан, простой.
Фигня!
> в vbs чуть сложнее (т.к. свой синтаксис для обработки ошибок
> но все равное проще, чем когда используется конвеерная обработка
Наглая ложь.
Ты не показал даже записи в журнал, из чего я делаю вывод:
это значительно сложнее, чем в моём случае,
ибо ты не стал даже пытаться предложить решение.
---
"Аллах не ведёт людей неверных."

Ivan8209

> поздравляю, ты не умеешь копировать из форума.
Предложишь объяснение, почему одна программа сработала?
> в исходной программе - не было 33 символов в первой строке.
Меня это не волнует, может, это какой-нибудь препроцессор разделитель строк съел.
Факт остаётся: из предложенных решений работает только одно.
---
"Аллах не ведёт людей неверных."

Ivan8209

> использует только Перл, без всяких там xargs.
Ну да?
> use File::Copy;
Одна только перловая библиотека перевесит все xargs вместе взятые.
---
"Аллах не ведёт людей неверных."

sany79

Согласен. Но достаточно иметь установленный Перл и всё.
Если File::Copy смущает, можно убрать и вместо copy вставить system "cp ... ...".

Dasar

> Предложишь объяснение, почему одна программа сработала?
потому что языки по разному относятся к переводам строк

Dasar

> Меня это не волнует, может, это какой-нибудь препроцессор разделитель строк съел.
теперь понятно почему так много "велосипедистов": основная причина - банальное не умение отлаживать чужой код.

Ivan8209

> достаточно иметь установленный Перл и всё.
С тем же успехом можно иметь установленный MinGW или базовый Cygwin.
> Если File::Copy смущает, можно убрать и вместо copy вставить system "cp ... ..."
Это потребует cp и sh, то есть того же Cygwin или MinGW.
---
"Аллах не ведёт людей неверных."

sany79

Ты не думай, я отдаю должное твоему решению.
Если нет cp, пускай будет system("COPY.COM ... ..." или как он там в ДОСе называется.

Ivan8209

>> Меня это не волнует, может, это какой-нибудь препроцессор разделитель строк съел.
> теперь понятно почему так много "велосипедистов":
> основная причина - банальное не умение отлаживать чужой код.
От тебя требовалось готовое работающее решение, ты его --- не предоставил.
И теперь все твои дальнейшие измышления отбрасываем,
как основывающиеся на несуществующем решении.
---
"Аллах не ведёт людей неверных."

bjc2

ага, последний вариант гораздо лучше) потому как установленный перл использовать я не имею права, сейчас пыталась скопировать все хотимые им библиотеки поштучно)
с system вариант уже нра, только что такое copy.com?
и мне нужно move а не copy,
и еще можно ли уже в таком случае с помощью bat-фала перенести один любой файл? (ну и вставить вызов этого батника в system)
то есть тот же move *.* перенесетт все файлы, а как ограничить их число одной штукой?)

Dasar

> Факт остаётся: из предложенных решений работает только одно.
правильный факт: квалификации у тебя хватило только на запуск одного решения.

Ivan8209

> Если нет cp, пускай будет system("COPY.COM ... ..." или как он там в ДОСе называется.
COPY --- это встроенная команда cmd/command.
Вопросы:
1. Сработает ли system в отсутствие Cygwin/MinGW?
1а. Существует ли такая сборка перла, основывающаяся на среде NT, а не на Cygwin/MinGW?
2. Не возникнет ли проблем с передачей имён файлов, содержащих пробелы?
Это, разумеется, второстепенный вопрос, поскольку навряд ли
промежуточные файлы содержат пробелы в именах.
Хотя... виндузятники и не до такого могут додуматься.
---
...Я работаю антинаучным аферистом...

Dasar

> Ты не показал даже записи в журнал, из чего я делаю вывод:
опять же решение стандартное: перехват 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);
 }
}

bjc2

работает стопудово, у меня уже есть скриптики, использующий только perl.exe и perl56.dll
с вызовом system

Elina74

>1. Сработает ли system в отсутствие Cygwin/MinGW?
>1а. Существует ли такая сборка перла, основывающаяся на среде NT, а не на Cygwin/MinGW?
activestate activeperl
>2. Не возникнет ли проблем с передачей имён файлов, содержащих пробелы?
не возникнет. Если уж возникли, возьми их в кавычки.
>навряд ли
>промежуточные файлы содержат пробелы в именах.
>Хотя... виндузятники и не до такого могут додуматься.
только линуксоеды настолько ущербны, что не могут себе позволить создавать файлы с пробелами в именах?

sany79

Я в Windows не очень секу. В ДОСе был командный процессор COMMAND.COM. Он (при вызове с определёнными ключами) мог выполнять команды оболочки типа COPY. Сейчас вместо COMMAND.COM, кажется, CMD.EXE.
system("CMD.EXE /непомнюкакойключ COPY /B ... ...").
Но если есть программа COPY.EXE можно обойтись без вызова CMD.EXE.
==
Посмотрел: нет COPY.EXE .

bjc2

не, проблем с вызовом досевой move или copy у меня нет, я уже реализовывала вызов bat-файла.
но проблема остается именно с копированием одного любого файла - мб это просто, но я не знаю как это делается

Elina74

вот тебе рабочий пример
system("copy 1.htm ..");

sany79

Отчего же, можно пробелы в именах. Только это неудобно.
copy(..., ...)
system('CMD.EXE', '/ключ', 'COPY', ..., ...)
— проблем с пробелами не будет. Будут проблемы с '/' вместо '\'.

Ivan8209

Правильный факт: решения нет.
Поскольку решение включало в себя инструкции по его запуску.
Подобные вопросы возникают не первый раз, и в предыдущих случаях
ты показал свои привычки в ответ на работающий код:
а) не давать код;
б) если давать, то полукод, который заранее известно, что не должен работать;
в) если, всё-таки, давать код, то тот, который либо не работает, либо невозможно использовать;
г) подменять задачи.
В этом обсуждении ты показал всё выше перечисленное:
а) после моей публикации кода, твоего ждали очень долго;
б) выбивали, чтобы ты опубликовал код полностью;
в) выбивали инструкции, как запускать;
г) ты стал вилять обработкой ошибок, которой исходно не было в задаче.
Причём:
в') не весь код оказался рабочим;
г') не приведён код, занимающийся обработкой ошибок,
несмотря на то, что мой код --- тривиален и частично приведён.
---
"Аллах не ведёт людей неверных."

bjc2

это довольно экзотичный все-таки случай=)
имен с пробелами там гарантированно нет

sany79

Да, я забыл! system в таком варианте вызывает шелл сам.
2 : вместо COPY — MOVE (или REN).

Elina74

а зачем system('cmd.exe', '...
если можно сразу system('...
?

Ivan8209


$ 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

Твой код --- _не_работает_.
В топку.
---
"Аллах не ведёт людей неверных."

sany79

Да, конечно. Я чё-то решил, что без CMD у _НАТАШИ_ не заработало и загрузился. Забыл уже родной ДОС 6.22.

bjc2

заработало=)
вопрос остался чисто досевый:
какой командой скопировать или переместить, уже не важно один файл?

Ivan8209

move /?
---
"...Исчезая в этих волнах."

sany79

COPY FILE1 FILE2
MOVE FILE1 FILE2

sany79

Кажется, в Винде будет проще на каком-нибудь Постскрипте написать, чем на VBS (

bjc2

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

bjc2

ну соответственно.
я сильно сомневаюсь в такой возможности оператора move

Dasar

> Кажется, в Винде будет проще на каком-нибудь Постскрипте написать, чем на VBS
контру не слушай - он не умеет под windows-ом работать.
на vbs и js нормально пишется, по крайней мере - не хуже, чем на других скриптах.

Elina74

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

Ivan8209

> контру не слушай - он не умеет под windows-ом работать.
Ты не умеешь решать простейшие задачи под твоей же ОС, а ещё лезешь других учить.
> на vbs и js нормально пишется, по крайней мере - не хуже, чем на других скриптах.
Из всего вышеизложенного легко видеть, что это наглая ложь.
---
"Аллах не ведёт людей неверных."

sany79

Запуск COPYANY вроде должен помочь. Копирует ПЕРВЫЙ файл.
COPYANY.BAT
===================
COPYONE.BAT C:\DIR1\*.*
===================
COPYONE.BAT
===================
COPY %1 DIR2
===================
Конечно, страшное уродство. К тому же я не уверен, что будет работать, если список *.* будет слишком длинным.
К тому же не возникнет ли проблем, если имя с пробелами? Может, взять %1 в кавычки?

bjc2

ок, попробую завтра)

Ivan8209

> StdErr.WriteLine
Кстати, вот тебе ещё несколько вопросов:
1. Ты будешь работать негром, записывающим то, что убегает в stderr?
Что-то не заметно, чтобы ты этот stderr хоть куда-нибудь перенаправил.
2. Куда девается stderr задач, запущенных из cron?
3. Где твой хвалёный полиморфизм и повторное использование кода?
Ты код поменял почти полностью, это не "old-script 2>>error.log".
---
"Аллах не ведёт людей неверных."

Dasar

> Поскольку решение включало в себя инструкции по его запуску.
для тупых повторяю по буквам
скопировать код из форума, один в один - с учетом пробелов и переводов строк.
vbs в файл q.vbs, js в файл q.js
запустить cscript q.vbs или cscript q.js

sany79

Я вижу, программирование скриптов для Windows требуют большого мужества, т. к. твои вопросы бьют наповал. Я даже уважаю людей, берущихся за столь безнадёжное дело.
Кстати, не просветит ли меня кто-нибудь: в Виндовс данные, передающиеся по конвейеру, пишутся во временные файлы в %TEMP%, как было в ДОСе, или теперь конвейер настоящий?

Ivan8209

>> Поскольку решение включало в себя инструкции по его запуску.
> для тупых повторяю по буквам
> vbs в файл q.vbs, js в файл q.js
Это ты только сейчас вспомнил, исходно этого не было.
Но:
>> решение включало в себя инструкции по его запуску.
То есть сейчас ты даёшь другое решение.
> запустить cscript q.vbs или cscript q.js
---
"Аллах не ведёт людей неверных."

Dasar

> То есть сейчас ты даёшь другое решение.
кончай тупить
твое решение кстати тоже не запускается, и инструкцию по запуску я не вижу

/ was unexpected at this time.

Ivan8209

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

danilov

а питон? на нём тоже просто написать... Только с виндой он не идёт

Ivan8209

> инструкцию по запуску я не вижу
А ты её только сейчас и спросил.
Запустить bash из Cygwin с установленными штатным образом bash, findutils и coreutils,
скормить ему текст, нажать "Enter".
---
"Аллах не ведёт людей неверных."

Ivan8209

> а питон? на нём тоже просто написать...
Если просто, то где решение?
---
"Аллах не ведёт людей неверных."

Dasar

> Что-то не заметно, чтобы ты этот stderr хоть куда-нибудь перенаправил.
где в исходной постановке от тебя - написано, что stderr не является журналом?
> 3. Где твой хвалёный полиморфизм и повторное использование кода?
да, javascript не поддерживает централизованной обработки ошибок.
кстати в sh тоже нет централизованной обработки ошибок

danilov

cp.py
_________________
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

Dasar

> lambda file: files.index(file) % 3 == 0, files
сложность O(N^2) - на кол-ве файлов больше 10-100 тыс. будут заметны тормоза.

danilov

можно простой счётчик

danilov

import glob, shutil, sys, os
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

Ivan8209

>> Что-то не заметно, чтобы ты этот stderr хоть куда-нибудь перенаправил.
> где в исходной постановке от тебя - написано, что stderr не является журналом?
Негром будешь ты работать?
Всё, что ты смог, это очень плохо воспроизвести первые мои скрипты,
которые нисколько не заботились об ошибках, никуда их не сохраняя.
>> 3. Где твой хвалёный полиморфизм и повторное использование кода?
> да, javascript не поддерживает централизованной обработки ошибок.
Речь не о централизованной обработке ошибок, а о повторном использовании кода.
Для того, чтобы добавить запись ошибок в stderr, тебе пришлось переворошить почти весь код.
Хочешь сказать, это хорошо?
Это --- отстой, почти нулевое повторное использование кода.
Процедурное замечание.
То, что ты заговорил не о повторном использовании кода, а об обработке исключений,
ещё раз показывает, что ты очень любишь подменять условия задачи,
отвечать не на поставленные вопросы, а на те, которые удобны тебе.
Я тебе дал дополнительное разъяснение по поставленному мной вопросу,
а ты его, судя по ответу, даже не удосужился прочитать.
Хочешь сказать, что тебя после такого можно принимать хоть сколь-нибудь серьёзно?
А ведь ты ещё строишь из себя высококвалифицированного профессионала.
---
"Истина грядёт --- её ничто не остановит!"

Dasar

> Всё, что ты смог, это очень плохо воспроизвести первые мои скрипты
демагогией занимаешься
да, javascript не умеют сам по себе skip-ать ошибки.
да, sh не умеет обрабатывать ошибки ювелирно.
Соответственно первый удобнее на задачах - когда нам нужен контроль за ошибками, второй удобнее - когда нам просто что-то надо сделать.
соответственно первый удобнее - при автоматизации, которая работает постоянно, второй удобнее - при автоматизации здесь и сейчас.
Да, текущие инструменты не совершенны.
какое это отношение имеет к стремлению разрабатывать программы полиморфно (с подсистемами, которые ортогональный друг другу)?
>> да, javascript не поддерживает централизованной обработки ошибок.
>>Речь не о централизованной обработке ошибок, а о повторном использовании кода.
>>...
>>То, что ты заговорил не о повторном использовании кода, а об обработке исключений,
окстись, какие еще exception-ы?
я только заметил, что и там, и там - обработка ошибок не является ортогональной (полиморфной) по отношению к остальному коду.

ava3443

А не полезу я в инет за тем, что должно быть в локальной документации.
б) потребовали доступа к Сети, потому что документация почему-то отсутствует на месте;
У нормальных людей это есть в локальной документации
Start -> All Programs -> Microsoft Developer Network -> MSDN Library for Visual Studio 2005

bobby

ava3443

Пока что видно, что:
а) оба решения появились значительно позднее моего;
б) потребовали доступа к Сети, потому что документация почему-то отсутствует на месте;
в) по меньшей мере, втрое длиннее.
Пока что видно, что:
а) твоё решение не решает поставленную задачу (советую внимательно перечитать первый пост)
б) на твоей конкретной отдельно взятой винде проблемы с документацией, так как ты её почему-то не установил
P.S.

Ivan8209

>> Всё, что ты смог, это очень плохо воспроизвести первые мои скрипты
> демагогией занимаешься
Если ты не знаешь смысла слов, которые произносишь, пользуйся словарём.
> да, javascript не умеют сам по себе skip-ать ошибки.
> да, sh не умеет обрабатывать ошибки ювелирно.
> Соответственно первый удобнее на задачах - когда нам нужен контроль за ошибками,
> второй удобнее - когда нам просто что-то надо сделать.
> соответственно первый удобнее - при автоматизации, которая работает постоянно,
> второй удобнее - при автоматизации здесь и сейчас.
Из вышеизложенного видно, что яваскрипт ни на что не годится,
потому что ты не можешь грамотно справиться с обработкой ошибок.
> Да, текущие инструменты не совершенны.
Ты сейчас о чём говоришь?
Пытаешься отвлечь внимание от того простого факта,
что ты не смог справиться даже с поставленной задачей
и достичь уровня программинования того же sh?
> какое это отношение имеет к стремлению разрабатывать программы полиморфно
> (с подсистемами, которые ортогональный друг другу)?
Это --- никакого, но ты показал нулевые возможности повторного использования кода.
Почему? Объяснение простое.
Потому что яваскрипт _не_поддерживает_повторное_использование_кода_.
Ибо если б он поддерживал, ты не стал бы ворошить весь код,
вставляя вывод сообщения об ошибке.
Ты сработал как обычный насильник, причём очень плохой насильник,
потому что уже давно никто не использует printf ---
для вывода такого рода сообщений существуют err/warn.
>>> да, javascript не поддерживает централизованной обработки ошибок.
>>Речь не о централизованной обработке ошибок, а о повторном использовании кода.
>>...
>>То, что ты заговорил не о повторном использовании кода, а об обработке исключений,
> окстись, какие еще exception-ы?
Ещё раз прочитай твои собственные слова:
>>> да, javascript не поддерживает централизованной обработки ошибок.
И, кстати, не надо подменять слова: я сказал "исключения", а не "exception"-ы.
Разницу видишь?
Если нет, что нисколько не удивительно, то поясняю:
исключение --- это не только "exception", исключение --- это любой исключительный случай,
требующий отдельной обработки, в отличие от "exception",
которое здесь несёт исключительно технический или даже технологический смысл.
> я только заметил,
Ты не только этого не заметил, но преднамеренно лжёшь.
> что и там, и там - обработка ошибок не является ортогональной (полиморфной)
> по отношению к остальному коду.
1. "Ортогональность" и "полиморфность" --- это совсем разные понятия,
друг с другом не связанные.
2. В отличие от яваскрипта, в sh обработка ошибок полностью ортогональна:
она использует имеющийся код почти без изменений.
Не надо ворошить весь код, как это сделал ты в случае яваскрипта,
для того, чтобы обрабатывать ошибки.
---
"Аллах не ведёт людей неверных."

Ivan8209

> MSDN Library for Visual Studio 2005
То есть, документация идёт:
а) даже не самостоятельным пакетом, а в составе третьего продукта;
б) документации в штатной установке всё равно нет.
Я понимаю, что при некотором желании я могу установить sh без документации,
вот только это --- увы-
...Я работаю антинаучным аферистом...

Ivan8209

> советую внимательно перечитать первый пост
Я с самого начала в курсе.
Просто Cygwin --- это must, его не просто полезно, а почти что необходимо иметь уже установленным.
Я с самого начала думал, что по затратам дискового пространства решение на Cygwin будет лёгче перлового.
В отличие от , я изменяю условия задачи в полезную сторону.
---
"Аллах не ведёт людей неверных."

Helga87

Полезную для кого/чего?

ava3443

То есть, документация идёт:
а) даже не самостоятельным пакетом, а в составе третьего продукта;
б) документации в штатной установке всё равно нет.
ИМХО документация идёт в составе Platform SDK, который загружается бесплатно без всяких третьих продуктов. Cygwin на винде - ещё менее штатная хрень, чем Platform SDK.

Ivan8209

Для конечного пользователя.
---
"Аллах не ведёт людей неверных."

Dasar

> 2. В отличие от яваскрипта, в sh обработка ошибок полностью ортогональна:
> она использует имеющийся код почти без изменений.
> Не надо ворошить весь код, как это сделал ты в случае яваскрипта,
> для того, чтобы обрабатывать ошибки.
вот здесь ты себя обманываешь.
добавь пожалуйста к своей задаче следующий функционал:
1. если не получилось получить информацию о файле или скопировать файл - то попробовать операцию еще раз, но не более 3-х
2. если не получилось подряд скопировать (или получить инфу) 10 файлов - то прекратить выполнение задачи.
вот если в sh - действительно обработка ошибок ортогональна по отношению к самой задаче, то ты нам сейчас за пару минут сможешь продемонстрировать решение.

Dasar

> и достичь уровня программинования того же sh?
зачем мне это делать?
в постановке задач - про обработку ошибок, вообще, речь не шла.
то что твое решение ошибки "съедает" - совсем не означает, что так надо делать и в реальной задаче тоже.
единственное - что я сделал - это показал, как при необходимости - эту обработку можно добавить

Ivan8209

>> То есть, документация идёт:
>> а) даже не самостоятельным пакетом, а в составе третьего продукта;
>> б) документации в штатной установке всё равно нет.
> ИМХО
То есть, ты сам до конца не уверен.
> документация идёт в составе Platform SDK, который загружается бесплатно без всяких третьих продуктов.
Это сам по себе третий продукт.
> Cygwin на винде - ещё менее штатная хрень, чем Platform SDK.
С этим можно поспорить, но мне уже лень.
Я не могу считать полезными языки программирования, вся ценность которых
заключена в их происхождении из недр "Микрософта" или "Сана."
---
"Аллах не ведёт людей неверных."

Flack_bfsp

Я не могу считать полезными языки программирования, вся ценность которых
заключена в их происхождении из недр "Микрософта" или "Сана."
Если ты про Джаваскрипт, то гы, лол.

Fragaria

Чё лол-то, мискрософт использует свою реализацию JavaScript, которая и называется-то JScript, а не JavaScript, как исходный нетскейповский продукт.

Dasar

> Чё лол-то, мискрософт использует свою реализацию JavaScript, которая и называется-то JScript, а не JavaScript, как исходный нетскейповский продукт
разве есть серьезные отличия? (если, конечно, не брать jscript.net)

Fragaria

Естественно Обычный JavaScript ни при каких условиях не может получить доступ к файловой системе. Он предназначен для другого - для работы в браузере. Так же, как и кросс-платформенная его реализация, ECMAScript. А то, чем ты пользуешься - это микрософтовские потуги закрыть вопиющий недостаток функциональности cmd с помощью языка программирования, изначально предназначенного совершенно для иных целей.

Flack_bfsp

Я в курсе, если что. Это Кохтпа не в курсе.

Ivan8209

>> 2. В отличие от яваскрипта, в sh обработка ошибок полностью ортогональна:
>> она использует имеющийся код почти без изменений.
>> Не надо ворошить весь код, как это сделал ты в случае яваскрипта,
>> для того, чтобы обрабатывать ошибки.
> вот здесь ты себя обманываешь.
> добавь пожалуйста к своей задаче следующий функционал:
Предложенный функционал не имеет смысла в условиях задачи,
так что добавлять его я не буду.
Если ты любишь заниматься решением оторванных от жизни задач, то пожалуйста!
Но не надо привлекать к этому ещё и меня.
То, что ты предложил добавлять эти из пальца высосанные возможности,
означает, что ты видишь, как их легко добавить.
Несмотря на то, что тебе придётся переворошить весь код,
то есть исходная критика остаётся в силе.
Опять хочешь почувствовать себя героем?
> 1. если не получилось получить информацию о файле или скопировать файл -
> то попробовать операцию еще раз, но не более 3-х
Ну-ка, расскажи, зачем это делать, если скрипт вызывается периодически.
> 2. если не получилось подряд скопировать (или получить инфу) 10 файлов - то прекратить выполнение задачи.
В этом смысла ещё меньше: перемещение в пределах одной файловой системы ---
малозатратно и не требует лишних ресурсов,
перемещение в другую файловую систему более затратно по времени,
но освобождает ресурсы памяти. Нафига останавливать раздачу?
Если раздачу всё-таки надо останавливать, то этим должны заниматься потребители,
которым может не хватать памяти.
Но это уже вопрос взаимодействия потребителей и производителя,
никаким образом не вовлекающий раздатчика.
> вот если в sh - действительно обработка ошибок ортогональна по отношению к самой задаче,
> то ты нам сейчас за пару минут сможешь продемонстрировать решение.
Давай так: ты считаешь себя героем, но ещё ничего не показал,
пары минут тебе не хватит, поэтому я согласен на двадцать.
Тебе выдаётся двадцать минут, а ты, _считая_твой_первоначальный_код_,
который неперелопаченный, _неприкосновенным_,
показываешь, как ты --- полиморфно или любым другим внешним образом ---
добавляешь журналирование ошибок.
Изменять первоначальный файл --- запрещается,
писать внешний функционал основной задачи --- тоже.
После этого я посмотрю, имеет ли смысл показывать тебе,
как решать твои высосанные из пальца задачи.
---
"Аллах не ведёт людей неверных."

Ivan8209

>> и достичь уровня программинования того же sh?
> зачем мне это делать?
Чтобы хоть сколько-нибудь подтвердить твою квалификацию, которая пока что никакая.
> в постановке задач - про обработку ошибок, вообще, речь не шла.
То есть теперь, когда тебя припёрли, ты признаёшь, что подменял условия.
> то что твое решение ошибки "съедает" - совсем не означает,
С чего это ты взял, что оно их съедает?
Оно их просто обрабатывает оповещением пользователя:
что, мол, были ошибки, не удивляйтесь, если что --- список.
> единственное - что я сделал - это показал, как при необходимости - эту обработку можно добавить
Ту, которая в моём решении шла изначально, да ещё и кривым способом.
---
"Аллах не ведёт людей неверных."

Ivan8209

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

gopnik1994

bat:

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

Dasar

> Естественно
в самом языке изменения есть?
> А то, чем ты пользуешься
про то, что ты говоришь - там добавлены только несколько доп. классов - но к самому языку это не имеет отношение, также как добавление доп. классы в Ajax-е, firefox-е и т.д.

Dasar

> Предложенный функционал не имеет смысла в условиях задачи,
если узко мыслить - то да.
> Ну-ка, расскажи, зачем это делать, если скрипт вызывается периодически.
в первую очередь - для того, чтобы показать ортогональную обработку ошибок, про которую ты так хвалился постом выше.
если по задаче - то такое может быть необходимо, если нужна последовательная обработка файлов.
> В этом смысла ещё меньше: перемещение в пределах одной файловой системы ---
перекидывание может происходит между машинами.
может запускаться резервная задача, которая эти же файлы перекидывает через другой канал.
> Если раздачу всё-таки надо останавливать, то этим должны заниматься потребители,
> которым может не хватать памяти.
так покажи, как они, благодаря ортогональной обработки ошибок в sh, смогут диагностировать данную ситуацию, и остановить задачу.

Dasar

> Тебе выдаётся двадцать минут, а ты, _считая_твой_первоначальный_код_,
> который неперелопаченный, _неприкосновенным_,
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 был тот стрим, который ты называешь журналом - сможешь?

Ivan8209


$ 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;

И кого ты хочешь надуть?
---
"Аллах не ведёт людей неверных."

Dasar

ты какие-то на ходу новые требования выдвигаешь непонятно зачем.

Dasar

Задача решена?
исходный код менялся?
повторение исходного функционала есть?

Ivan8209

Задача не решена: исходный код изменён полностью.
---
"Аллах не ведёт людей неверных."

Dasar

> Задача не решена: исходный код изменён полностью.
в каком это месте?
q.js - как был, так и остался без изменений.

Ivan8209

Препроцессирование --- это, по-твоему, повторное использование кода?

$ wc q{1,2}*
16 37 383 q1.js
16 47 417 q2.js

Легко видеть, что исходные тексты сравнимы по объёму,
то есть, по-прежнему, повторное использование кода --- никакое.
По качеству.
С тем же успехом можно было бы написать программу

cat > q.js <<EOF
...
EOF

---
...Я работаю антинаучным аферистом...

Dasar

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

ava3443

> > ИМХО
> То есть, ты сам до конца не уверен
Чтоб ты знал, ИМХО на русский переводится как "по моему мнению" или "по моему скромному мнению", а не "до конца не уверен". Если б я был не уверен, я бы написал AFAIK.
> > документация идёт в составе Platform SDK, который загружается бесплатно без всяких третьих продуктов.
> Это сам по себе третий продукт.
А заголовочные файлы и маны в линуксе или FreeBSD - это как, третий продукт?

Dasar

> Легко видеть, что исходные тексты сравнимы по объёму
Где в исходной постановке про это шла речь?
опять на ходу меняешь условия.

Ivan8209

Ну а теперь сравни с моим:

old-script

Ты, кстати, так и не озаботился перенаправлением в файл.
Как у тебя обстоит дело с кроном? Куда он девает stderr и stdout?
---
...Я работаю антинаучным аферистом...

Ivan8209

>>> документация идёт в составе Platform SDK, который загружается бесплатно без всяких третьих продуктов.
>> Это сам по себе третий продукт.
> А заголовочные файлы и маны в линуксе или FreeBSD - это как, третий продукт?
Линукс вообще не ОС, а в БСД они ставятся с того же носителя.
---
"Аллах не ведёт людей неверных."

Dasar

> Ты, кстати, так и не озаботился перенаправлением в файл.
ты сообщения читаешь прежде чем ответишь? а прочитанный текст обдумываешь?
сделать, чтобы в errout был тот стрим, который ты называешь журналом - сможешь?
> Как у тебя обстоит дело с кроном? Куда он девает stderr и stdout?
куда ему скажешь перенаправить - туда и денет.

Ivan8209

> сделать, чтобы в errout был тот стрим, который ты называешь журналом - сможешь?

$ 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?
> куда ему скажешь перенаправить - туда и денет.
Вот и перенаправь!
---
"Аллах не ведёт людей неверных."

bjc2

не работает=)

banderon

Могу предложить еще такой вариант

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
)
Запускать так (Windows):
cmd /Q /V:ON /C mv.bat dir1 dir2
переносит ~треть файлов из dir1 в dir2.

gopnik1994

я не тестировал
а что именно?

bjc2

утром попробую

bjc2

| unexpected at this time
по поводу 3 строчки вроде)

bjc2

кстати 1)именно ТАК он не запускается, запустился просо из фара 1.bat dir1 dir2
2)не работает=)
3)идея понятна, если все форы выразить через готу, или пересмотреть синтаксис форов...
по крайней мере читабельно

banderon

Просто из ФАРа работать не будет, важно наличие ключа /V:ON у cmd, так как без него !I! будет просто равно "!I!", а не текущему значению I.
Может еще и от операционки сильно зависит - не знаю. Но у меня все работает на ура

ashap

вобщем. спасибо)
всем)
Оставить комментарий
Имя или ник:
Комментарий: