Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   сохранить копию вывода консольного окна в txt файл (http://forum.oszone.net/showthread.php?t=342316)

shadowbat 24-09-2019 11:51 2889357

сохранить копию вывода консольного окна в txt файл
 
есть код
Код:

for %%i in ("%CD%\*.txt") do ( copy "%%i" "%%~dpni_copy%%~xi" )
pause

консольное окно выдаёт:
Код:

D:\>for %i in ("D:\*.txt") do (copy "%i" "%~dpni_copy%~xi" )

D:\>(copy "D:\111.txt" "D:\111_copy.txt" )
Скопировано файлов:        1.

D:\>(copy "D:\222.txt" "D:\222_copy.txt" )
Скопировано файлов:        1.

D:\>pause
Для продолжения нажмите любую клавишу . . .


как сохранить копию вывода консольного окна в txt файл ?
желательно с %date% %time% перед каждой строкой, но можно и без этого
вариант 1 не подходит, потому что в консольном окне перестаёт писать произведённые действия. (но сам лог файл нормальный, подходящий)
вариант 2 не подходит, потому что лог совсем не совпадает с окном, да еще и в самом окне не пишет "скопировано файлов 1"
вариант 1

Код:

>"log.txt" (for %%i in ("%CD%\*.txt") do (copy "%%i" "%%~dpni_copy%%~xi"))
pause

выдаёт
окно
Код:

D:\>(for %i in ("D:\*.txt") do (copy "%i" "%~dpni_copy%~xi" ) ) 1>"log.txt"

D:\>pause
Для продолжения нажмите любую клавишу . . .

txt
Код:

D:\>(copy "D:\111.txt" "D:\111_copy.txt" )
Скопировано файлов:        1.

D:\>(copy "D:\222.txt" "D:\222_copy.txt" )
Скопировано файлов:        1.



вариант 2

Код:

for %%i in ("%CD%\*.txt") do ( copy "%%i" "%%~dpni_copy%%~xi" > log.txt )
pause

выдаёт
окно
Код:

D:\>for %i in ("D:\*.txt") do (copy "%i" "%~dpni_copy%~xi"  1>log.txt )

D:\>(copy "D:\111.txt" "D:\111_copy.txt"  1>log.txt )

D:\>(copy "D:\222.txt" "D:\222_copy.txt"  1>log.txt )

D:\>pause
Для продолжения нажмите любую клавишу . . .

txt
Код:

Скопировано файлов:        1.

Iska 24-09-2019 12:32 2889363

Вариант 3. Берёте tee.exe (например, из комплекта GnuWin32 CoreUtils for Windows) и пользуете. Скажем, такое:
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sLog=Log.log

if exist "%sLog%" del /f /q "%sLog%"

>nul chcp 1251
for %%i in ("%CD%\*.txt") do (
        copy "%%~i" "%%~dpni_copy%%~xi"
) |tee.exe -a "%sLog%"
pause |tee.exe -a "%sLog%"
>nul chcp 866

endlocal
exit /b 0

Конечно, такое себе… :(

Вариант 4. Пользуете PowerShell, в качестве tee.exe — командлет Tee-Object.

Цитата:

Цитата shadowbat
вариант 2 не подходит, потому что лог совсем не совпадает с окном, »

Потому что этим кодом Вы на каждом очередном проходе цикла перезаписываете («> log.txt») лог-файл, созданный на предыдущем проходе цикла.


Кстати, я категорически не рекомендую проводить какие-либо манипуляции с именами файлов, над которыми производится цикл выборки «for». Дело в том, что выборка подходящих по маске файлов не делается сразу при входе, поиск очередного файла производится на каждом проходе (банальными FindFirstFile() на первом проходе и FindNextFile() на последующих). Посему при подобном коде на определённых наборах можно получить вовсе не то, что ожидалось (вплоть до бесконечного исполнения пакетного файла). Например, попробуйте исполнить приведённый Вами код на таком наборе файлов (на разделе с файловой системой NTFS):
Код:

0001.txt
0001_b.txt
0002.txt


shadowbat 24-09-2019 13:18 2889366

Цитата:

Цитата Iska
Потому что этим кодом Вы на каждом очередном проходе цикла перезаписываете («> log.txt») лог-файл, созданный на предыдущем проходе цикла. »

если использовать >> log.txt, то в принципе то же самое, не показывается откуда куда копировалось
Код:

Скопировано файлов:        1.
Скопировано файлов:        1.
Скопировано файлов:        1.

Цитата:

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

Iska 24-09-2019 13:54 2889377

Цитата:

Цитата shadowbat
не показывается откуда куда копировалось »

Оно никогда не показывается. Не предусмотрено таковой возможности у внутренней команды copy.

Цитата:

Цитата shadowbat
конечно нужно в другую папку копировать, »

Или делать разбор по for /f отбора по dir — вот тут будет целиком.

alpap 24-09-2019 14:04 2889382

shadowbat
Код:

@echo off
set "d=C:\Papka"

pushd "%d%"
 for /f "delims=" %%a in ('dir /a-d/b "*.txt"') do set "ext=%%~xa"& call :# "%%a" "%%~na" "%%ext:.=%%"
popd
pause& exit

:#
 if not exist "%~2-%~3\%~2 %~3" md "%~2-%~3\%~2 %~3"
 >>log.txt (
  echo -------------------------------------
  echo %date%-%time%
  echo copy "%~1" "%~2-%~3\%~2 %~3"
  copy "%~1" "%~2-%~3\%~2 %~3"
  echo -------------------------------------
 )
exit /b


shadowbat 24-09-2019 15:49 2889406

Цитата:

Цитата alpap
:# »


по подобию решения от alpap сделал код для первого сообщения:
Код:

@for %%i in ("%CD%\*.txt") do ( call :# "%%i" "%%~dpni_copy%%~xi")
pause

:#
@>>"log.txt" (echo %date%-%time% copy "%~1" "%~2" & copy "%~1" "%~2")
@exit /b

окно консоли:
Код:

D:\>(call :# "D:\111.txt" "D:\111_copy.txt" )

D:\>(call :# "D:\222.txt" "D:\222_copy.txt" )

D:\>pause
Для продолжения нажмите любую клавишу . . .

лог
Код:

24.09.2019-15:45:29,35 copy "D:\111.txt" "D:\111_copy.txt"
Скопировано файлов:        1.
24.09.2019-15:45:29,70 copy "D:\222.txt" "D:\222_copy.txt"
Скопировано файлов:        1.

только, не пишет "Скопировано файлов: 1." в консоли
это максимум, который можно вытянуть из окна в данной ситуации?

Iska 24-09-2019 16:43 2889418

Цитата:

Цитата shadowbat
только, не пишет "Скопировано файлов: 1." в консоли »

Ну, так Вы же перенаправляете именно этот вывод с консоли в файл:
Цитата:

Цитата shadowbat
Код:

@>>"log.txt" (echo %date%-%time% copy "%~1" "%~2" & copy "%~1" "%~2")
»

Цитата:

Цитата shadowbat
это максимум, который можно вытянуть из окна в данной ситуации? »

Окна консоли мы тут вообще не касаемся. Нет в пакетных файлах никакой возможности для того.

DJ Mogarych 24-09-2019 16:52 2889420

shadowbat, используйте robocopy.

shadowbat 24-09-2019 16:55 2889421

кривенький вариант на xcopy с костылями, тоже не идеально, пишет "Copied files: 1" даже если %errorlevel% <> 0 (например нет файла)
пока вердикт такой : штатными средствами нельзя отображать одно и то же в консоли и в логе файла, либо возможно с длиннющими костылями

код
Код:

@for %%i in ("%CD%\*.txt") do ( call :# "%%i" "%%~dpni_copy%%~xi")
pause

:#
@>>"log.txt" (
@xcopy "%~1" "%~2"* /y
@if %errorlevel% EQU 0 (echo Copied files:      1.) else (echo Copied files:      0.)
@echo %date%-%time% xcopy "%~1" "%~2"* /y
)
@exit /b

окно консоли:
Код:

D:\>(call :# "D:\111.txt" "222.txt" )

D:\>(call :# "D:\111.txt" "222.txt" )

D:\>pause
Для продолжения нажмите любую клавишу . . .

лог:
Код:

D:\111.txt
Скопировано файлов: 1.
Copied files:      1.
24.09.2019-16:46:51,65 xcopy "D:\111.txt" "D:\222.txt"* /y
D:\222.txt
Скопировано файлов: 1.
Copied files:      1.
24.09.2019-16:46:51,67 xcopy "D:\111.txt" "D:\222.txt"* /y

Цитата:

Цитата DJ Mogarych
shadowbat, используйте robocopy. »

с таким же успехом можно и свой cmd2 написать, с блекджеком

alpap 24-09-2019 17:33 2889427

Цитата:

Цитата shadowbat
только, не пишет ... в консоли »

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

Iska 24-09-2019 18:06 2889434

Цитата:

Цитата shadowbat
с таким же успехом можно и свой cmd2 написать, с блекджеком »

Что не так? Robocopy уж лет двадцать как доступен в составе Resource Kit'ов, с Vista или Windows 7 напрямую включён в поставку.

shadowbat 24-09-2019 18:39 2889439

Цитата:

Цитата alpap
существует как бы негласное правило работы или в консоле или в файле »

это всё объясняет

Цитата:

Цитата Iska
Robocopy с Vista или Windows 7 напрямую включён в поставку. »

каждый день как новый, проверил и правда включён https://en.wikipedia.org/wiki/Robocopy


Время: 18:05.

Время: 18:05.
© OSzone.net 2001-