Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Дублирование вывода на экран в файл, bat'ник

18K
21 декабря 2006 года
nikopol
18 / / 21.12.2006
Здраствуйте, имееться вот такой батник:
Код:
@echo off
:repit
sobr c:\File\send\*.xxx
if errorlevel 1 goto repit
copy c:\File\send\*.xxx c:\For\IN
copy c:\File\send\*.xxx c:\File\SendBak >nul
del c:\File\Send\*.xxx
cd \potrc
po_trc
move D:\OUT_POST\*.* D:\OUT_POST\otp >nul
copy C:\FOR\SEND\*.* D:\OUT
del C:\FOR\SEND\*.* /Q >nul
pause

Необходимо чтобы все что выводиться(ну и то что не выводиться, писалось в лог). Когда запускаеться sobr у юзверя запрашиваеться пароль, поэтому он должен видеть это приглашение. У меня операторами перенаправления вывода >>, получаеться писать только в файл, на экран ничего не выводиться, с операторами >&, <& в конец запутался.
Была подана идея использовать tee из комплекта unix utils, но возникли трудности, батник до конца не отрабатывает, останавливается после вызова po_trc(еще одна программа выполняющая действия с файлами которые до этого копировали), пишет в лог move D:\OUT_POST\*.* D:\OUT_POST\otp >nul и все.
Собсвенно что у меня получилось использую >> и tee:
Код:
@echo off
set mof=c:\log\log.txt
echo == %date% %time% == | tee -a %mof%
:repit
sobr c:\File\send\*.xxx | tee -a %mof%
if errorlevel 1 goto repit
copy c:\File\send\*.xxx c:\For\IN | tee -a %mof%
copy c:\File\send\*.xxx c:\File\SendBak >> %mof%
del c:\File\Send\*.xxx | tee -a %mof%
cd \potrc
po_trc  | tee -a %mof%
move D:\OUT_POST\*.* D:\OUT_POST\otp >> %mof%
copy C:\FOR\SEND\*.* D:\OUT  | tee -a %mof%
del C:\FOR\SEND\*.* /Q >> %mof%
pause

Множно ли както решить эту проблему без использования tee стандартными средствами винды?
и что дает для tee флаг -i (ignorre interrupts)(с юниксами не работал никогда). Какие нибудь советы, поправки к тому что есть?
309
21 декабря 2006 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Необходимо чтобы все что выводиться(ну и то что не выводиться, писалось в лог).


Разделяем задачу на две:
1. Вывод в лог результатов команд DOS/WINDOWS
Просто производим перенаправление стандартного потока вывода в файл ("> Имя_Файла" для перезаписи или ">> Имя_Файла" для дозаписи).
Потом (в конце работы) можно вывести лог на экран (type Имя_Файла)
2. Вывод в лог результатов программы. Здесь всё гораздо сложнее:
Если программа при каждом запуске запрашивает только ввод одних и тех же параметров, то можно переопределить ей стандартный поток ввода, передавая информацию через "трубу"

 
Код:
echo ПАРОЛЬ | myprog /params > log.txt
type log.txt

На поток ввода программы будет отправлено слово "ПАРОЛЬ". Программа будет выполнена с параметрами "params", результат - выведен в файл log.txt, который потом будет отображён на экране

Однако для программ с большей сложностью пользовательского интерфейса такой метод не сработает :(
А уж лог такая программа должна вести сама. Если такой возможности в ней не предусмотрено, вам не повезло.
18K
21 декабря 2006 года
nikopol
18 / / 21.12.2006
Цитата: el scorpio
Разделяем задачу на две:
1. Вывод в лог результатов команд DOS/WINDOWS
Просто производим перенаправление стандартного потока вывода в файл ("> Имя_Файла" для перезаписи или ">> Имя_Файла" для дозаписи).
Потом (в конце работы) можно вывести лог на экран (type Имя_Файла)


рассматривал такой вариант, но очень смущает наличие "дополнительного" файла(вроде как буфер для хранения временных данных получаеться, которые выводим на экран и пишем в лог)

Цитата: el scorpio
Разделяем задачу на две:
2. Вывод в лог результатов программы. Здесь всё гораздо сложнее:
Если программа при каждом запуске запрашивает только ввод одних и тех же параметров, то можно переопределить ей стандартный поток ввода, передавая информацию через "трубу"
 
Код:
echo ПАРОЛЬ | myprog /params > log.txt
type log.txt

На поток ввода программы будет отправлено слово "ПАРОЛЬ". Программа будет выполнена с параметрами "params", результат - выведен в файл log.txt, который потом будет отображён на экране

Однако для программ с большей сложностью пользовательского интерфейса такой метод не сработает :(
А уж лог такая программа должна вести сама. Если такой возможности в ней не предусмотрено, вам не повезло.


но в данном случае юзер не увидит приглашения на ввод пароля? А для них это критично... говорят типа откуда нам знать что его уже вводить...
если это так можно конечно выше сделать эхо "введите пароль". но для меня все это выглядит как будто костыли подставляем... tee почти идеально решение, но... тоже есть баги... а хочеться "красиво" сделать.

405
21 декабря 2006 года
Dmitrii
554 / / 16.12.2004
nikopol, а сценарием на VBS воспользоваться не хотите?
Если есть интерес к такой альтернативе, то к завтрашнему дню могу набросать (прямо сейчас, к сожалению, не могу).
Уточню, что для этого потребуется использовать FSO, а на Windows 9x/NT, насколько мне известно, она отсутствует.
18K
21 декабря 2006 года
nikopol
18 / / 21.12.2006
Цитата: Dmitrii
nikopol, а сценарием на VBS воспользоваться не хотите?
Если есть интерес к такой альтернативе, то к завтрашнему дню могу набросать (прямо сейчас, к сожалению, не могу).
Уточню, что для этого потребуется использовать FSO, а на Windows 9x/NT, насколько мне известно, она отсутствует.


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

405
22 декабря 2006 года
Dmitrii
554 / / 16.12.2004
Цитата: nikopol
с таким еще не сталкивался, было бы очень интересно посмотреть как это может выглядеть. на машине на которой требуеться вести лог стоит ХР.


Этого сообщения вчера уже не видел. Поэтому ничего не делал. А сейчас у нас рабочий день уже в полном разгаре, поэтому свободного времени практически нет.
Впрочем, может быть это и к лучшему, т.к. надо сделать несколько уточнений.
1. Программа sobr работает только в консольном режиме? А программа po_trc?
2. Работу с кириллицей в командной строке предусатривать надо (дело в том, что сценарии используют кодировку 1251)?
3. Что должно заноситься в журнал "из того, что не выводится"?

18K
22 декабря 2006 года
nikopol
18 / / 21.12.2006
Цитата: Dmitrii
Этого сообщения вчера уже не видел. Поэтому ничего не делал. А сейчас у нас рабочий день уже в полном разгаре, поэтому свободного времени практически нет.
Впрочем, может быть это и к лучшему, т.к. надо сделать несколько уточнений.
1. Программа sobr работает только в консольном режиме? А программа po_trc?
2. Работу с кириллицей в командной строке предусатривать надо (дело в том, что сценарии используют кодировку 1251)?
3. Что должно заноситься в журнал "из того, что не выводится"?


1. да только консоль и sobr и po_trc
2. без разницы, там вводиться только один раз пароль, и он вводиться не кириллицей
3. имел ввиду >nul (запрет на вывод на экран результатов команды), tee например результаты таких команды в файл не пишет, а >> пишет , собственно это не критично, можно >nul убрать.
нашел кстати более красивый способ полностью вести лог в файл:

 
Код:
set OUTPUT=out.log
if "%STDOUT_REDIRECTED%" == "" (
    set STDOUT_REDIRECTED=yes
    cmd.exe /c %0 %* >%OUTPUT%
    exit /b %ERRORLEVEL%
)

и все что идет дальше будет выводиться в файл, избавляет от многочисленных > и >>, но опять же в моем случае не подходит. на экране ничего не увидим. информация была найдена: http://rsdn.ru/
405
25 декабря 2006 года
Dmitrii
554 / / 16.12.2004
Вот пробный вариант:
Код:
Dim fsObj, pntFile, pntDir, curFile
Dim scrShell, scrExec, inStream, outStream
Dim myStr, sourceDir, targetDir
Const ForWriting = 2

Set fsObj = CreateObject("Scripting.FileSystemObject")
Set pntFile = fsObj.OpenTextFile("c:\log_file.txt", ForWriting, True)

':repit
'sobr c:\File\send\*.xxx
'if errorlevel 1 goto repit
Set scrShell = CreateObject("WScript.Shell")
WScript.StdOut.Write "Введите пароль: "
Set scrExec = scrShell.Exec("c:\sobr.exe c:\File\send\*.xxx")
Set inStream = scrExec.StdIn
inStream.WriteLine WScript.StdIn.ReadLine
Set outStream = scrExec.StdOut
While Not outStream.AtEndOfStream
    myStr = Trim(outStream.ReadLine())
    pntFile.WriteLine(myStr)
    WScript.StdOut.WriteLine myStr
Wend
Set inStream = Nothing
Set outStream = Nothing
Set scrExec = Nothing
pntFile.WriteLine("Завершена работа программы SOBR")

'copy c:\File\send\*.xxx c:\For\IN
sourceDir = "c:\File\send\"
targetDir = "c:\For\IN\"
On Error Resume Next
Set pntDir = fsObj.GetFolder(sourceDir)
For Each curFile In pntDir.Files
    If StrComp(fsObj.GetExtensionName(curFile),"xxx",vbTextCompare) = 0 Then
        curFile.Copy targetDir
        If Err.Number <> 0 Then
            myStr = curFile.Path & " " & Err.Description
            Err.Clear
        Else
            myStr = curFile.Path & " скопирован в " & targetDir
        End If
        pntFile.WriteLine(myStr)
        WScript.StdOut.WriteLine myStr
    End If
Next

'copy c:\File\send\*.xxx c:\File\SendBak >nul
targetDir = "c:\File\SendBak\"
For Each curFile In pntDir.Files
    If StrComp(fsObj.GetExtensionName(curFile),"xxx",vbTextCompare) = 0 Then
        curFile.Copy targetDir
        If Err.Number <> 0 Then
            myStr = curFile.Path & " " & Err.Description
            Err.Clear
        Else
            myStr = curFile.Path & " скопирован в " & targetDir
        End If
        pntFile.WriteLine(myStr)
    End If
Next

'del c:\File\Send\*.xxx
For Each curFile In pntDir.Files
    If StrComp(fsObj.GetExtensionName(curFile),"xxx",vbTextCompare) = 0 Then
        xName = curFile.Name
        fsObj.DeleteFile curFile, True
        If Err.Number <> 0 Then
            myStr = xName & " " & Err.Description
            Err.Clear
        Else
            myStr = xName & " удалён из " & sourceDir
        End If
        pntFile.WriteLine(myStr)
        WScript.StdOut.WriteLine myStr
    End If
Next

'cd \potrc
'po_trc
Set scrExec = scrShell.Exec("c:\potrc\po_trc.exe")
Set outStream = scrExec.StdOut
While Not outStream.AtEndOfStream
    myStr = Trim(outStream.ReadLine())
    pntFile.WriteLine(myStr)
    WScript.StdOut.WriteLine myStr
Wend
Set outStream = Nothing
Set scrExec = Nothing
Set scrShell = Nothing
pntFile.WriteLine("Завершена работа программы PO_TRC")

'move D:\OUT_POST\*.* D:\OUT_POST\otp >nul
sourceDir = "D:\OUT_POST\"
targetDir = "D:\OUT_POST\otp\"
Set pntDir = fsObj.GetFolder(sourceDir)
For Each curFile in pntDir.Files
    xName = curFile.Name
    fsObj.MoveFile curFile, targetDir
    If Err.Number <> 0 Then
        myStr = xName & " " & Err.Description
        Err.Clear
    Else
        myStr = xName & " перемещён из " & sourceDir & " в " & targetDir
    End If
    pntFile.WriteLine(myStr)
Next

''copy C:\FOR\SEND\*.* D:\OUT
sourceDir = "C:\FOR\SEND\"
targetDir = "D:\OUT\"
Set pntDir = fsObj.GetFolder(sourceDir)
For Each curFile in pntDir.Files
    curFile.Copy targetDir
    If Err.Number <> 0 Then
        myStr = curFile.Path & " " & Err.Description
        Err.Clear
    Else
        myStr = curFile.Path & " скопирован в " & targetDir
    End If
    pntFile.WriteLine(myStr)
    WScript.StdOut.WriteLine myStr
Next

''del C:\FOR\SEND\*.* /Q >nul
For Each curFile in pntDir.Files
    xName = curFile.Name
    fsObj.DeleteFile curFile, True
    If Err.Number <> 0 Then
        myStr = xName & " " & Err.Description
        Err.Clear
    Else
        myStr = xName & " удалён из " & sourceDir
    End If
    pntFile.WriteLine(myStr)
Next
pntFile.Close
Set pntFile = Nothing
Set pntDir = Nothing
Set fsObj = Nothing

Этот код надо сохранить в текстовый файл и задать ему расширение .vbs (например, script.vbs).
В запускающем bat-файле надо написать:
[color=blue]
@echo off
cscript.exe script.vbs
pause
[/color]
Я нарочно не стал оптимизировать код сценария, чтобы Вам было понятнее, где и какие именно операции выполняются.
"Закомментированные" строки вставил для той же цели.
Проверьте у себя работоспособность этого сценария.
Если такой способ решения задачи в целом устраивает, то можно будет приступать к "шлифовке".
18K
25 декабря 2006 года
nikopol
18 / / 21.12.2006
Цитата: Dmitrii
Вот пробный вариант:
......
Этот код надо сохранить в текстовый файл и задать ему расширение .vbs (например, script.vbs).
В запускающем bat-файле надо написать:
[color=blue]
@echo off
cscript.exe script.vbs
pause
[/color]
Я нарочно не стал оптимизировать код сценария, чтобы Вам было понятнее, где и какие именно операции выполняются.
"Закомментированные" строки вставил для той же цели.
Проверьте у себя работоспособность этого сценария.
Если такой способ решения задачи в целом устраивает, то можно будет приступать к "шлифовке".


Спасибо, завтра в обед попробую, о результатах отпишу. Код в принципе понятен, что можете посоветовать почитать по данной теме?

308
25 декабря 2006 года
Комаджу
850 / / 26.07.2006
Цитата: nikopol
что можете посоветовать почитать по данной теме?

http://ru.wikipedia.org/wiki/VBScript

405
26 декабря 2006 года
Dmitrii
554 / / 16.12.2004
Цитата: nikopol
... что можете посоветовать почитать по данной теме?


Ссылка на основной источник информации:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/scriptinga.asp
Ссылка на дополнительный источник информации:
http://www.script-coding.info/

Поскольку для решения Вашей задачи используются ресурсы Windows Script Host, советую скачать справку (она - на русском) по этому инструментарию:
http://www.script-coding.info/wsh_chm.zip

18K
26 декабря 2006 года
nikopol
18 / / 21.12.2006
Ошибка VBS Обьект не поддерживает данный метод или свойство Exec, строка 14.
 
Код:
Set scrExec = scrShell.Exec("c:\sobr.exe c:\File\send\*.xxx")

Что может такое быть?

з.ы. за ссылки спасибо.
405
26 декабря 2006 года
Dmitrii
554 / / 16.12.2004
Цитата: nikopol
Ошибка VBS Обьект не поддерживает данный метод или свойство Exec, строка 14.
 
Код:
Set scrExec = scrShell.Exec("c:\sobr.exe c:\File\send\*.xxx")

Что может такое быть?


Судя по сообщению - дело в том, как создан объект scrShell.
Попробуйте у себя работу вот этого сценария:

 
Код:
Set scrShell = CreateObject("WScript.Shell")
Set scrExec = scrShell.Exec("notepad.exe")

Сценарий проверен под XP. Он должен корректно запускать блокнот и из графического, и из консольного режимов.
Если ошибка повторится, то, думаю, дело в некорректной работе вашего экземпляра WSH.
18K
26 декабря 2006 года
nikopol
18 / / 21.12.2006
Цитата: Dmitrii
Судя по сообщению - дело в том, как создан объект scrShell.
Попробуйте у себя работу вот этого сценария:
 
Код:
Set scrShell = CreateObject("WScript.Shell")
Set scrExec = scrShell.Exec("notepad.exe")

Сценарий проверен под XP. Он должен корректно запускать блокнот и из графического, и из консольного режимов.
Если ошибка повторится, то, думаю, дело в некорректной работе вашего экземпляра WSH.


угу, на моей машине нормально отрабатывает, на той где нужно батник запускать выдает ошибку. ошибка MS VBScript и т.д.... Есть возможность это как то исправить?(кроме переустановки винды)

405
26 декабря 2006 года
Dmitrii
554 / / 16.12.2004
Цитата: nikopol
угу, на моей машине нормально отрабатывает, на той где нужно батник запускать выдает ошибку. ошибка MS VBScript и т.д.... Есть возможность это как то исправить?(кроме переустановки винды)


Попробуйте следующее:
1. Проверьте наличие всяческих обновлений на этой машине.
2. Скопируйте на неё (со своей, например) файлы wscript.exe, cscript.exe, scrrun.dll, scrobj.dll (найдёте их в каталоге system32).

18K
26 декабря 2006 года
nikopol
18 / / 21.12.2006
Цитата: Dmitrii
Попробуйте следующее:
1. Проверьте наличие всяческих обновлений на этой машине.
2. Скопируйте на неё (со своей, например) файлы wscript.exe, cscript.exe, scrrun.dll, scrobj.dll (найдёте их в каталоге system32).


хм.. я немного в начале дезинформировал, на машине Win2000 SP4 стоит. Может это особенности винды? Что то настроить?
Жалко книжка хорошая по 2000 дома лежит :(

Цитата:
Уточню, что для этого потребуется использовать FSO, а на Windows 9x/NT, насколько мне известно, она отсутствует.


Имелась ввиду именно NT или вся линейка вплоть до 2000?

405
26 декабря 2006 года
Dmitrii
554 / / 16.12.2004
Цитата: nikopol
хм.. я немного в начале дезинформировал, на машине Win2000 SP4 стоит. Может это особенности винды? Что то настроить?


У меня тоже Win2000 SP4. Сценарии я отлаживал в первую очередь под этой ОС. Ровным счётом ничего специально не настраивал.
Пробуйте работу тестового сценария на другой машине с такой же ОС. Если там - работает, то перенесите оттуда указанные файлы.

Цитата: nikopol
Имелась ввиду именно NT или вся линейка вплоть до 2000?


Именно NT4.0.

18K
26 декабря 2006 года
nikopol
18 / / 21.12.2006
Цитата: Dmitrii
У меня тоже Win2000 SP4. Сценарии я отлаживал в первую очередь под этой ОС. Ровным счётом ничего специально не настраивал.
Пробуйте работу тестового сценария на другой машине с такой же ОС. Если там - работает, то перенесите оттуда указанные файлы.


Именно NT4.0.


ок, попробую.

18K
27 декабря 2006 года
nikopol
18 / / 21.12.2006
разобрался с виндой и ошибкой Exec, на машине оказываеться WSH 5.1 стояло, а метод Exec как я понял с сайта мелкомягких был введен только в версии 5.6. Скачал инсталятор, поставил, метод Exec прекрасно заработал, жду обеда для проверки основного скрипта.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог