如何解决写入命令的输出和错误以分隔日志文件+控制台的变量
在帖子之后:https://stackoverflow.com/a/34489424/14947713 @dbenham 发布了他的代码: 他能够将 Stdout/Stderr 重定向到变量并设计一个早期版本,该版本利用了他声称的更高效的文件。
我无法弄清楚的是如何将他的“yourCommand”替换为:调用同一脚本(ffmpeg 进程和 For 循环)中较低的一段代码。最后,我试图控制控制台上显示的内容,但要彻底记录日志文件中发生的情况。
我几天来一直在搜索和比较/测试脚本,但似乎无法突破这一点。 最下面的一段代码是 ffmpeg 脚本,它具有现有的日志记录功能,我的目标是在这个 @dbenham 脚本中重新创建/重新利用。
@echo off
setlocal disableDelayedExpansion
set "STDOUT="
SET "STDERR="
for /f "delims=" %%E in (
'2^>^&1 (for /f "delims=" %%O in ('^
yourCommand^
^^^^^^^| findstr /n /r "^"'^) do @(echo ^^^^^^^|%%O^)^) ^| findstr /n /r "^"'
) do (
set "ln=%%E"
setlocal enableDelayedExpansion
set "ln=x!ln:*:=!"
set "ln=!ln:\=\s!"
if "!ln:~0,2!"=="x|" (
set "ln=!ln:~0,-1!"
for /f "delims=" %%A in (^""!STDOUT!"^") do for /f "delims=" %%B in (^""!ln:*:=!"^") do (
endlocal
set "STDOUT=%%~A%%~B\n"
)
) else (
for /f "delims=" %%A in (^""!STDERR!"^") do for /f "delims=" %%B in (^""!ln:~1!"^") do (
endlocal
set "STDERR=%%~A%%~B\n"
)
)
)
setlocal enableDelayedExpansion
for %%L in (^"^
%= empty line =%
^") do (
if defined STDOUT (
set "STDOUT=!STDOUT:\n=%%~L!"
set "STDOUT=!STDOUT:\s=\!"
set "STDOUT=!STDOUT:~0,-1!"
)
if defined stderr (
set "STDERR=!STDERR:\n=%%~L!"
set "STDERR=!STDERR:\s=\!"
set "STDERR=!STDERR:~0,-1!"
)
)
echo ** STDOUT **
echo(!STDOUT!
echo ** STDERR **
echo(!STDERR!
exit /b
为了更容易的测试目的,我修改了上面的代码: @回声关闭 setlocal disableDelayedExpansion 设置 /a out.cnt=err.cnt=0
(for /f "delims=. tokens=1*" %%A in ('^""%~f0" :test5 2^>err.log ^| findstr /n "^"^"') do (
for /f "delims=:" %%N in ("%%A") do (
set "ln=%%A"
echo this is the ln var: "%ln%"
setlocal enableDelayedExpansion
for /f "delims=" %%B in (^""!ln:*:=!"^") do (
endlocal
set "out.%%N=%%~B"
set "out.cnt=%%N"
)
)
)
)2>err.log
for /f "delims=" %%A in ('findstr /n "^" err.log') do for /f "delims=:" %%N in ("%%A") do (
set "ln=%%A"
echo this is the ln2 var: "%ln%"
setlocal enableDelayedExpansion
for /f "delims=" %%B in (^""!ln:*:=!"^") do (
endlocal
set "err.%%N=%%~B"
set "err.cnt=%%N"
)
)
:: Display the results
setlocal enableDelayedExpansion
echo ** STDOUT **
for /l %%N in (1 1 %out.cnt%) do echo(!out.%%N!
echo ** STDERR **
for /l %%N in (1 1 %err.cnt%) do echo(!err.%%N!
echo ** STDERR END **
exit /b
:test5
echo - This is the TEST5
echo STDOUT line 1 with empty line following
echo(
>&2 echo STDERR line 1 with empty line following
>&2 echo(
echo STDOUT line 3 with poison characters "(<^&|!%%>)" (^<^^^&^|!%%^>)
>&2 echo STDERR line 3 with poison characters "(<^&|!%%>)" (^<^^^&^|!%%^>)
echo err.4:STDOUT line 4 spoofed as stderr - No problem!
>&2 echo out.4:STDERR line 4 spoofed as stdout - No problem!
echo :STDOUT line 5 leading colon preserved
>&2 echo :STDERR line 5 leading colon preserved
echo ;STDOUT line 6 default EOL of ; not a problem
>&2 echo ;STDERR line 6 default EOL of ; not a problem
exit /b
我遇到了这个脚本(在下面):https://stackoverflow.com/a/9344547/14947713 但目前我无法重新配置以使用它。 @回声关闭 设置本地 如果 "%~1" neq "" 转到 :test
:: Initialize
set log="myLog.log"
2>nul del %log%
2>nul del "test*.marker"
set procCount=5
set testCount=10
:: Launch %procCount% processes that write to the same log
for /l %%n in (1 1 %procCount%) do start "" /b "%~f0" %%n
:wait for child processes to finish
2>nul dir /b "test*.marker" | find /c "test" | >nul findstr /x "%procCount%" || goto :wait
:: Verify log results
for /l %%n in (1 1 %procCount%) do (
<nul set /p "=Proc %%n log count = "
find /c "Proc %%n: " <%log%
)
:: Cleanup
del "test*.marker"
exit /b
==============================================================================
:: code below is the process that writes to the log file
:test
set instance=%1
for /l %%n in (1 1 %testCount%) do (
call :log echo Proc %instance% says hello!
call :log dir "%~f0"
)
echo done >"test%1.marker"
exit
:log command args...
2>nul (
>>%log% (
echo ***********************************************************
echo Proc %instance%: %date% %time%
%*
(call ) %= This odd syntax guarantees the inner block ends with success =%
%= We only want to loop back and try again if redirection failed =%
)
) || goto :log
exit /b
现有的 ffmpeg 脚本及其现有的日志记录 第一:将日志结构设置到 %drive% 目标(包含“!”),创建新的日志目标目录并将文件名保存为日期+时间。
2nd(core-1):使用 ffprobe.exe 搜索定义的音频编解码器(即“dts”) 3rd(core-2):然后将每个结果送入 ffmpeg 以复制文件,但转码为“eac3”和“ac3”。
披露:
-
此 ffmpeg 脚本的现有问题包括“FilesEncoded”计数。 理想情况下,它会显示计数
-
我还尝试合并“start /abovenormal”,以便我可以将 ffmpeg 进程置于高优先级。
-
我似乎被卡住了,但昨天我一直在寻找使用 ffmpeg-progressbar-cli https://github.com/sidneys/ffmpeg-progressbar-cli 这样它会显示每个文件的进度条和基本信息,这就是为什么有末尾的第二个 FINALCOMMAND 行 ::out。但没有运气....
我感谢任何人可以提供的任何帮助。
@ECHO OFF
rem #######NEEDED INSTALLED####################################
rem For the "ffmpeg-bar wrapper" node.js is needed
rem And then npm install --global ffmpeg-progressbar-cli
rem #######NEEDED INSTALLED####################################
setlocal
rem #######1-Destination Drive #############
SET drive=T:\4k.temp
set string=%CD%
rem ####1-Destination Drive###################################
setlocal EnableDelayedExpansion
set "SEARCHSlash=\"
set "REPLACETEXT=_"
set "modified="
set "OUTTEXTFILE="
for %%* in (.) do SET LogFolder=%%~n*
set "LOGFILE="
set "SEARCHDrive="
set "REPLACEDriveLetter="
set "timestmpIN="
set "timestmpFIN="
SET "DT="
SET "HH="&SET "MM="&SET "SS="&SET "timestamp1="
SET "daymth="
set "colon=^:"
set "period=^."
set "modified=!string:%SEARCHSlash%=%REPLACETEXT%!"
ECHO !modified!
set "SEARCHDrive=!modified:~0,18!"
set "OUTTEXTFILE=!modified:%SEARCHDrive%=%REPLACEDriveLetter%!"
SET DT=%date:/=-%
SET daymth=%DT:~4,5%
for /F "tokens=2" %%i in ('date /t') do set mydate=%%i
set mytime=%time%
ECHO Current time is %mydate%:%mytime%
FOR /F "TOKENS=1 DELIMS=:" %%A IN ('TIME/T') DO SET HH=%%A
SET MM=%time:~3,2%&SET SS=%time:~6,2%
SET "timestamp1=%HH%.%MM%.%SS%"
ECHO This is timestamp: %timestamp1%
rem #######2-Destination Logs #############
MD "%drive%\Logs\%LogFolder%"
SET LOGFILE=%drive%\Logs\%LogFolder%\Log-%OUTTEXTFILE%--%daymth%..%timestamp1%.log
(call ^:logit)>>%LOGFILE%
ECHO This is the logfile: %LOGFILE%
rem #######2-Destination Logs #############
ECHO THIS IS THE START OF LOGIT
endlocal
:logit
setlocal EnableExtensions EnableDelayedExpansion
SET "FINALCOMMAND="
rem #######3-Codecs Desired to Convert #############
SET "Codec1=dts"
SET "Codec2=null2"
SET "Codec3=null2"
rem #######3-Codecs Desired to Convert #############
setlocal EnableExtensions DisableDelayedExpansion
SET "ProgramFolder=C:\Program Files\FFmpeg-v2020\bin"
SET "ProbeOptions=-v quiet -select_streams a:0 -show_entries "stream^^=codec_name" -of json"
set "FilesFound=0"
set "FilesEncoded=0"
set "FullFileName="
set "output="
ECHO This is the Current Directory: %CD%
ECHO Loop1Loop1Loop1Loop1Loop1Loop1Loop1Loop1Loop1Loop1Loop1Loop1Loop1Loop1Loop1Loop1Loop1Loop1Loop1Loop1
for /F "delims=" %%I in ('dir *.mkv *.mp4 /A-D-H /B /S 2^>nul') do (
ECHO This is the Program Folder: %ProgramFolder%
ECHO This is the Program Options: %ProgramOptions%
set "FullFileName=%%I"
ECHO "FullFileName %%I"
set "output=%drive%%%~pI%%~nxI"
SET "folderOUTpath2=%drive%%%~pI"
ECHO This is the Folderoutpath2: "%folderOUTpath2%"
SET "folderOUTpath=%folderOUTpath2%"
ECHO "folderOUTpath-nonVar: %drive%%%~pI"
ECHO "folderOUTpath-1 %folderOUTpath%"
set /A FilesFound+=1
set "AudioCodec="
SET "SkipCodecs="
ECHO FullFileName2-nonVar "FullFileName %%I"
ECHO FullFileName2 "%FullFileName%"
ECHO folderOUTpath2-nonVar "folderOUTpath %drive%%%~pI"
ECHO folderOUTpath2-orig: %folderOUTpath%
ECHO folderOUTpath2 !folderOUTpath2!
ECHO folderOUTpath2-orig: %folderOUTpath%
ECHO Loop2Loop2Loop2Loop2Loop2Loop2Loop2Loop2Loop2Loop2Loop2Loop2Loop2Loop2Loop2Loop2Loop2
ECHO this is variable %%B
ECHO this is variable %%~B
ECHO this is variable %%C
ECHO this is variable %%~C
for /F "eol={ tokens=1,2 delims=,:[ ]{} " %%B in ('""%ProgramFolder%\ffprobe.exe" %ProbeOptions% "%%I""') do (
ECHO this is variable %%B
ECHO this is variable %%~B
ECHO this is variable %%C
ECHO this is variable %%~C
if "%%~B" == "codec_name" (
if not defined AudioCodec (
set "AudioCodec=%%~C"
)
if "%%~C" == "%Codec1%" (set "SkipCodecs=1" &ECHO This is Transcode Codec1: %Codec1%
) else if "%%~C" == "%Codec2%" (set "SkipCodecs=1" &ECHO This is Transcode Codec2: %Codec2%
) else if "%%~C" == "%Codec3%" (set "SkipCodecs=1" &ECHO This is Transcode Codec3: %Codec3%
)
)
)
ECHO This is Skipcodecs: %SkipCodecs%
ECHO This is Skipcodecs: !SkipCodecs!
ECHO skipcodecs2: %SkipCodecs%
ECHO FolderOutPath3.1 !folderOUTpath!
ECHO FolderOutPath3.11 %folderOUTpath%
ECHO Fullname3 "folderOUTpath %drive%%%~pI"
ECHO Reading File1: !FullFileName!
ECHO Reading File1: %FullFileName%
ECHO "Make Directory for NEW FILE 1: "%drive%%%~pI""
setlocal EnableExtensions EnableDelayedExpansion
if !SkipCodecs! == 1 (
setlocal EnableExtensions DisableDelayedExpansion
ECHO "Make Directory for NEW FILE 2.1: "%drive%%%~pI""
ECHO "Make Directory for NEW FILE 2.2: "!folderOUTpath!""
MKDIR "%drive%%%~pI" & ECHO This is the current file processing: !FullFileName!
endlocal
)
ECHO Reading File2: !FullFileName!
ECHO Reading Folder: !folderOUTpath!
ECHO.
ECHO Audio codec-Final: !AudioCodec!
if !SkipCodecs! == 1 ECHO This is skipcodecsFinal: "!SkipCodecs!"
ECHO.
if !SkipCodecs! == 1 (
ECHO Processing ffmpeg x265 to make AC3 with: "!SkipCodecs!"
ECHO This is the Output Path2:: "!output!"
rem SET FINALCOMMAND="%ProgramFolder%\ffmpeg.exe" -n -hide_banner -loglevel warning -stats -i "!FullFileName!" -map 0:v -threads 6 -map 0:a:0 -map 0:a:0 -map 0:s? -c:v copy -c:a copy -c:s copy -c:a:0 eac3 -b:a:0 640k -c:a:1 ac3 -b:a:1 640k "!output!"
SET "FINALCOMMAND=ffmpeg -n -hide_banner -loglevel quiet -stats -i "!FullFileName!" -map 0:v -threads 6 -map 0:a:0 -map 0:a:0 -map 0:s? -c:v copy -c:a copy -c:s copy -c:a:0 eac3 -b:a:0 640k -c:a:1 ac3 -b:a:1 640k "!output!""
ECHO this is the command1: !FINALCOMMAND!
!FINALCOMMAND!&SET /A FilesEncoded+=1
ECHO COMPLETE &ECHO #########################################################################
if not %FilesEncoded% == 0 ECHO These are FilesEncoded1: %FilesEncoded%
if not errorlevel 1 set /A FilesEncoded+=1
if not %FilesEncoded% == 0 ECHO These are FilesEncoded2: %FilesEncoded%
) else (ECHO NOT PROCESSING &ECHO ###################################################################)
endlocal
)
ECHO(
ECHO Re-encoded !FilesEncoded! of %FilesFound% video file%PluralS%.
endlocal
endlocal
再次感谢任何人提供的任何帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。