Дублирование вывода на экран в файл, bat'ник
: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:
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)(с юниксами не работал никогда). Какие нибудь советы, поправки к тому что есть?
Разделяем задачу на две:
1. Вывод в лог результатов команд DOS/WINDOWS
Просто производим перенаправление стандартного потока вывода в файл ("> Имя_Файла" для перезаписи или ">> Имя_Файла" для дозаписи).
Потом (в конце работы) можно вывести лог на экран (type Имя_Файла)
2. Вывод в лог результатов программы. Здесь всё гораздо сложнее:
Если программа при каждом запуске запрашивает только ввод одних и тех же параметров, то можно переопределить ей стандартный поток ввода, передавая информацию через "трубу"
type log.txt
На поток ввода программы будет отправлено слово "ПАРОЛЬ". Программа будет выполнена с параметрами "params", результат - выведен в файл log.txt, который потом будет отображён на экране
Однако для программ с большей сложностью пользовательского интерфейса такой метод не сработает :(
А уж лог такая программа должна вести сама. Если такой возможности в ней не предусмотрено, вам не повезло.
1. Вывод в лог результатов команд DOS/WINDOWS
Просто производим перенаправление стандартного потока вывода в файл ("> Имя_Файла" для перезаписи или ">> Имя_Файла" для дозаписи).
Потом (в конце работы) можно вывести лог на экран (type Имя_Файла)
рассматривал такой вариант, но очень смущает наличие "дополнительного" файла(вроде как буфер для хранения временных данных получаеться, которые выводим на экран и пишем в лог)
2. Вывод в лог результатов программы. Здесь всё гораздо сложнее:
Если программа при каждом запуске запрашивает только ввод одних и тех же параметров, то можно переопределить ей стандартный поток ввода, передавая информацию через "трубу"
type log.txt
На поток ввода программы будет отправлено слово "ПАРОЛЬ". Программа будет выполнена с параметрами "params", результат - выведен в файл log.txt, который потом будет отображён на экране
Однако для программ с большей сложностью пользовательского интерфейса такой метод не сработает :(
А уж лог такая программа должна вести сама. Если такой возможности в ней не предусмотрено, вам не повезло.
но в данном случае юзер не увидит приглашения на ввод пароля? А для них это критично... говорят типа откуда нам знать что его уже вводить...
если это так можно конечно выше сделать эхо "введите пароль". но для меня все это выглядит как будто костыли подставляем... tee почти идеально решение, но... тоже есть баги... а хочеться "красиво" сделать.
Если есть интерес к такой альтернативе, то к завтрашнему дню могу набросать (прямо сейчас, к сожалению, не могу).
Уточню, что для этого потребуется использовать FSO, а на Windows 9x/NT, насколько мне известно, она отсутствует.
Если есть интерес к такой альтернативе, то к завтрашнему дню могу набросать (прямо сейчас, к сожалению, не могу).
Уточню, что для этого потребуется использовать FSO, а на Windows 9x/NT, насколько мне известно, она отсутствует.
с таким еще не сталкивался, было бы очень интересно посмотреть как это может выглядеть. на машине на которой требуеться вести лог стоит ХР.
Этого сообщения вчера уже не видел. Поэтому ничего не делал. А сейчас у нас рабочий день уже в полном разгаре, поэтому свободного времени практически нет.
Впрочем, может быть это и к лучшему, т.к. надо сделать несколько уточнений.
1. Программа sobr работает только в консольном режиме? А программа po_trc?
2. Работу с кириллицей в командной строке предусатривать надо (дело в том, что сценарии используют кодировку 1251)?
3. Что должно заноситься в журнал "из того, что не выводится"?
Впрочем, может быть это и к лучшему, т.к. надо сделать несколько уточнений.
1. Программа sobr работает только в консольном режиме? А программа po_trc?
2. Работу с кириллицей в командной строке предусатривать надо (дело в том, что сценарии используют кодировку 1251)?
3. Что должно заноситься в журнал "из того, что не выводится"?
1. да только консоль и sobr и po_trc
2. без разницы, там вводиться только один раз пароль, и он вводиться не кириллицей
3. имел ввиду >nul (запрет на вывод на экран результатов команды), tee например результаты таких команды в файл не пишет, а >> пишет , собственно это не критично, можно >nul убрать.
нашел кстати более красивый способ полностью вести лог в файл:
if "%STDOUT_REDIRECTED%" == "" (
set STDOUT_REDIRECTED=yes
cmd.exe /c %0 %* >%OUTPUT%
exit /b %ERRORLEVEL%
)
и все что идет дальше будет выводиться в файл, избавляет от многочисленных > и >>, но опять же в моем случае не подходит. на экране ничего не увидим. информация была найдена: http://rsdn.ru/
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]
Я нарочно не стал оптимизировать код сценария, чтобы Вам было понятнее, где и какие именно операции выполняются.
"Закомментированные" строки вставил для той же цели.
Проверьте у себя работоспособность этого сценария.
Если такой способ решения задачи в целом устраивает, то можно будет приступать к "шлифовке".
......
Этот код надо сохранить в текстовый файл и задать ему расширение .vbs (например, script.vbs).
В запускающем bat-файле надо написать:
[color=blue]
@echo off
cscript.exe script.vbs
pause
[/color]
Я нарочно не стал оптимизировать код сценария, чтобы Вам было понятнее, где и какие именно операции выполняются.
"Закомментированные" строки вставил для той же цели.
Проверьте у себя работоспособность этого сценария.
Если такой способ решения задачи в целом устраивает, то можно будет приступать к "шлифовке".
Спасибо, завтра в обед попробую, о результатах отпишу. Код в принципе понятен, что можете посоветовать почитать по данной теме?
Ссылка на основной источник информации:
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
Что может такое быть?
з.ы. за ссылки спасибо.
Что может такое быть?
Судя по сообщению - дело в том, как создан объект scrShell.
Попробуйте у себя работу вот этого сценария:
Set scrExec = scrShell.Exec("notepad.exe")
Сценарий проверен под XP. Он должен корректно запускать блокнот и из графического, и из консольного режимов.
Если ошибка повторится, то, думаю, дело в некорректной работе вашего экземпляра WSH.
Попробуйте у себя работу вот этого сценария:
Set scrExec = scrShell.Exec("notepad.exe")
Сценарий проверен под XP. Он должен корректно запускать блокнот и из графического, и из консольного режимов.
Если ошибка повторится, то, думаю, дело в некорректной работе вашего экземпляра WSH.
угу, на моей машине нормально отрабатывает, на той где нужно батник запускать выдает ошибку. ошибка MS VBScript и т.д.... Есть возможность это как то исправить?(кроме переустановки винды)
Попробуйте следующее:
1. Проверьте наличие всяческих обновлений на этой машине.
2. Скопируйте на неё (со своей, например) файлы wscript.exe, cscript.exe, scrrun.dll, scrobj.dll (найдёте их в каталоге system32).
1. Проверьте наличие всяческих обновлений на этой машине.
2. Скопируйте на неё (со своей, например) файлы wscript.exe, cscript.exe, scrrun.dll, scrobj.dll (найдёте их в каталоге system32).
хм.. я немного в начале дезинформировал, на машине Win2000 SP4 стоит. Может это особенности винды? Что то настроить?
Жалко книжка хорошая по 2000 дома лежит :(
Имелась ввиду именно NT или вся линейка вплоть до 2000?
У меня тоже Win2000 SP4. Сценарии я отлаживал в первую очередь под этой ОС. Ровным счётом ничего специально не настраивал.
Пробуйте работу тестового сценария на другой машине с такой же ОС. Если там - работает, то перенесите оттуда указанные файлы.
Именно NT4.0.
Пробуйте работу тестового сценария на другой машине с такой же ОС. Если там - работает, то перенесите оттуда указанные файлы.
Именно NT4.0.
ок, попробую.