写入命令的输出和错误以分隔日志文件+控制台的变量

如何解决写入命令的输出和错误以分隔日志文件+控制台的变量

在帖子之后: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”。

披露:

  1. 此 ffmpeg 脚本的现有问题包括“FilesEncoded”计数。 理想情况下,它会显示计数

  2. 我还尝试合并“start /abovenormal”,以便我可以将 ffmpeg 进程置于高优先级。

  3. 我似乎被卡住了,但昨天我一直在寻找使用 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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res