Показать полную графическую версию : сохранить копию вывода консольного окна в txt файл
shadowbat
24-09-2019, 11:51
есть код
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"
>"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.
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.
Вариант 3. Берёте tee.exe (https://en.wikipedia.org/wiki/Tee_(command)) (например, из комплекта GnuWin32 CoreUtils for Windows (http://gnuwin32.sourceforge.net/packages/coreutils.htm)) и пользуете. Скажем, такое:
@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.
вариант 2 не подходит, потому что лог совсем не совпадает с окном, »
Потому что этим кодом Вы на каждом очередном проходе цикла перезаписываете («> log.txt») лог-файл, созданный на предыдущем проходе цикла.
Кстати, я категорически не рекомендую проводить какие-либо манипуляции с именами файлов, над которыми производится цикл выборки «for». Дело в том, что выборка подходящих по маске файлов не делается сразу при входе, поиск очередного файла производится на каждом проходе (банальными FindFirstFile() на первом проходе и FindNextFile() на последующих). Посему при подобном коде на определённых наборах можно получить вовсе не то, что ожидалось (вплоть до бесконечного исполнения пакетного файла). Например, попробуйте исполнить приведённый Вами код на таком наборе файлов (на разделе с файловой системой NTFS):
0001.txt
0001_b.txt
0002.txt
shadowbat
24-09-2019, 13:18
Потому что этим кодом Вы на каждом очередном проходе цикла перезаписываете («> log.txt») лог-файл, созданный на предыдущем проходе цикла. »
если использовать >> log.txt, то в принципе то же самое, не показывается откуда куда копировалось
Скопировано файлов: 1.
Скопировано файлов: 1.
Скопировано файлов: 1.
выборка подходящих по маске файлов не делается сразу при входе, поиск очередного файла производится на каждом проходе
да, конечно нужно в другую папку копировать, он даже в этом примере копию только что созданного лог файла делает.
не показывается откуда куда копировалось »
Оно никогда не показывается. Не предусмотрено таковой возможности у внутренней команды copy.
конечно нужно в другую папку копировать, »
Или делать разбор по for /f отбора по dir — вот тут будет целиком.
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
:# »
по подобию решения от 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." в консоли
это максимум, который можно вытянуть из окна в данной ситуации?
только, не пишет "Скопировано файлов: 1." в консоли »
Ну, так Вы же перенаправляете именно этот вывод с консоли в файл:
@>>"log.txt" (echo %date%-%time% copy "%~1" "%~2" & copy "%~1" "%~2") »
это максимум, который можно вытянуть из окна в данной ситуации? »
Окна консоли мы тут вообще не касаемся. Нет в пакетных файлах никакой возможности для того.
DJ Mogarych
24-09-2019, 16:52
shadowbat, используйте robocopy.
shadowbat
24-09-2019, 16:55
кривенький вариант на 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
shadowbat, используйте robocopy. »
с таким же успехом можно и свой cmd2 написать, с блекджеком
только, не пишет ... в консоли »
вообще существует как бы негласное правило работы или в консоле или в файле, т.е. если вывод идет в лог, то и происходит это без участия пользователя, тихо и незаметно и все разборы потом уже ведутся с логом.
с таким же успехом можно и свой cmd2 написать, с блекджеком »
Что не так? Robocopy уж лет двадцать как доступен в составе Resource Kit'ов, с Vista или Windows 7 напрямую включён в поставку.
shadowbat
24-09-2019, 18:39
существует как бы негласное правило работы или в консоле или в файле »
это всё объясняет
Robocopy с Vista или Windows 7 напрямую включён в поставку. »
каждый день как новый, проверил и правда включён https://en.wikipedia.org/wiki/Robocopy
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.