Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 文本输出位置_Batch File_Batch Processing - Fatal编程技术网

Batch file 文本输出位置

Batch file 文本输出位置,batch-file,batch-processing,Batch File,Batch Processing,我有两个文本文件,我想使用它们获取output.txt,如下所示: file1.txt: file2.txt: output.txt: 但这里的问题是,使用下面的代码,我得到了output.txt,如下所示,其中FreePhysicalMemory被放错了位置..: 代码: output.txt: 当然,这是因为您有两行总计,而您的新请求有三行 您必须修改程序,以便包含一行或多行总计: @echo off setlocal EnableDelayedExpansion rem Read inf

我有两个文本文件,我想使用它们获取output.txt,如下所示:

file1.txt:

file2.txt:

output.txt:

但这里的问题是,使用下面的代码,我得到了output.txt,如下所示,其中FreePhysicalMemory被放错了位置..:

代码:

output.txt:


当然,这是因为您有两行总计,而您的新请求有三行

您必须修改程序,以便包含一行或多行总计:

@echo off
setlocal EnableDelayedExpansion

rem Read info from file1
set i=0
for /F "tokens=1,2" %%a in (file1.txt) do (
   set /A i+=1
   set order[!i!]=%%a
   set info[%%a]=%%b
)

rem Save totals
set total3=!order[%i%]!
set /A i-=1
set total2=!order[%i%]!
set /A i-=1
set total1=!order[%i%]!
set /A i-=1

rem Read/merge info from file2
for /F "tokens=1,2" %%a in (file2.txt) do (
   if defined info[%%a] (
      set info[%%a]=!info[%%a]! %%b
   ) else (
      set /A i+=1
      set order[!i!]=%%a
      set info[%%a]=0.00 %%b
   )
)

rem Return totals to end
set /A i+=1
set order[%i%]=%total1%
set /A i+=1
set order[%i%]=%total2%
set /A i+=1
set order[%i%]=%total3%

rem Format and output information
(
echo OPERATING SYSTEM       SERVER1    SERVER2
for /L %%i in (1,1,%i%) do (
   for /F %%a in ("!order[%%i]!") do (
      for /F "tokens=1,2" %%b in ("!info[%%a]!") do (
         set "os=%%a                      "
         set "s1=  %%b"
         if "%%c" equ "" (
            set "s2=     0.00"
         ) else (
            set "s2=     %%c"
         )
         echo !os:~0,22!  !s1:~-5!  !s2:~-9!
      )
   )
)
) > output.txt
其中list.seq包含

如果在一个文件中找到一个元素,但在另一个文件中找不到,则丢失的数据将显示0.00

如果一个值不包含小数,它将被移动2个空格以使单位列与小数对齐

未出现在数据文件中但在list.seq文件中提到的元素将以0.00的值出现


数据文件中出现的列表中未提及的元素。seq文件将按字母顺序显示在列表中出现的元素之后。seq

这是一种完全不同的方法,具有以下特点:

服务器文件的数量易于扩展。只需将一个新文件添加到加载数据部分外部循环的列表中。 每个服务器的头都是通过删除扩展名从文件名派生的。 每个服务器列的宽度易于配置 操作系统标签列的宽度易于配置 缺少的值显示为空白,而不是错误的0 操作系统标签按字母顺序显示,后跟摘要行。 末尾摘要行的数量和顺序易于配置。只需在查找变量中添加或减去值。 我将FILE1.TXT、FILE2.TXT重命名为SERVER1.TXT、SERVER2.TXT。我还将SERVER1.TXT复制到SERVER3.TXT,以便测试上一列中缺少的值

@回音 setlocal enableDelayedExpansion ::清除任何现有的$variables 对于/f delims==%%A在“set$2>nul”中设置%%A= ::加载数据 设置cnt=0 设为空白= 设置宽度=8 设置labelWidth=22 集合查找=FreePhysicalMemory:2 TotalVisibleMemorySize:3 CPULoadPercentage:4 对于server1.txt server2.txt server3.txt中的%%F,请执行以下操作 set val=%blank%%%~nF 设置$0。操作系统=$0.操作系统!val:~-%width%! 对于%%f do中的/f代币=1,2%%A 设置测试=!查找:%%A:=! 如果测验equ!查找!设置前缀=$1。否则设置前缀=$!测试:~0,1!。 换成%%P英寸!前缀做 如果没有定义!前缀!%%A. 对于1中的/l%%N!cnt!是否设置%%P%%A=!%P%%A!空白:~-%宽度%! 否则,如果!%%A.内克!cnt! 设置%%P%%A=!%P%%A!空白:~-%宽度%! 设置值=%blank%%%B 设置%%P%%A=!%P%%A!val:~-%width%! 设置/a%%a=cnt+1 设置/a cnt+=1 ::打印结果 对于/f标记=2*delims=。=%A,在“set$”中 设置标签=%%A%空白% 回响标签:~0,%labelWidth%!%B -输出-

OPERATINGSYSTEM         SERVER1  SERVER2  SERVER3
Android                             3.46
Linux                      2.78     5.76     2.78
MacOS                      3.45     6.39     3.45
Ubuntu                     4.12              4.12
Windows                    1.36     4.42     1.36
FreePhysicalMemory        30.12    31.65    30.12
TotalVisibleMemorySize    48.00    48.00    48.00
CPULoadPercentage             2        4        2
编辑以响应OP注释

这是一个修改版本,它使用NULL表示缺少的值,并将输出写入文本文件

@echo off
setlocal enableDelayedExpansion

:: Clear any existing $ variables
for /f "delims==" %%A in ('"set $ 2>nul"') do set "%%A="

:: Load data
set "cnt=0"
set "blank=                                               "
set  "null=                                           NULL"
set "width=8"
set "labelWidth=22"
set "lineWidth=0"
set "lookup= FreePhysicalMemory:2 TotalVisibleMemorySize:3 CPULoadPercentage:4"
for %%F in (server1.txt server2.txt server3.txt) do (
  set "val=%blank%%%~nF"
  set "$0.OPERATINGSYSTEM=!$0.OPERATINGSYSTEM! !val:~-%width%!"
  for /f "tokens=1,2" %%A in (%%F) do (
    set "test=!lookup:* %%A:=!"
    if "!test!" equ "!lookup!" (set "prefix=$1.") else set "prefix=$!test:~0,1!."
    for %%P in (!prefix!) do (
      if not defined !prefix!%%A (
        for /l %%N in (1 1 !cnt!) do set "%%P%%A=!%%P%%A! !null:~-%width%!"
      ) else if "!%%A!" neq "!cnt!" (
        set "%%P%%A=!%%P%%A! !null:~-%width%!"
      )
      set "val=%blank%%%B"
      set "%%P%%A=!%%P%%A! !val:~-%width%!"
    )
    set /a "%%A=cnt+1"
  )
  set /a cnt+=1, lineWidth+=width+1
)

:: Print results
(for /f "tokens=2* delims=.=" %%A in ('set $') do (
  set "line=%%B !null:~-%width%!"
  set "label=%%A%blank%"
  echo !label:~0,%labelWidth%!!line:~0,%lineWidth%!
))>output.txt

怎么放错地方了?所需序列的公式是什么?@Magoo..Hi..根据代码的公式是:1.从文件1读取信息2.保存总计3.从文件2读取/合并信息4.将总计返回到结尾5.格式化和输出信息。确定输出顺序的公式是什么?它看起来是任意的。Magoo..但我看到的是:当我从file1.txt和file2.txt中删除“CPULoadPercentage”行时..然后output.txt按上述所需顺序出现。这个问题的关键是数据总共有多少行?你必须意识到2和3是不同的!请看下面我的答案…谢谢..Aacini..它解决了我的问题..我完全忘记了“保存总数”。@Magoo..尝试过,但输出顺序如下:操作系统、Android、CPULoadPercentage、FreePhysicalMemory、Linux、MacOS、TotalVisibleMemorySize、Ubuntu、,Windows您会注意到序列是按字母顺序排列的。很可能,文件list.seq不包含所需的行序列,或者无法访问-可能是您将其命名错误,或者将其保存为list.seq.txt。名称没有什么神奇之处—只需更改for/f%%v行中的文件名以匹配即可—但请确保内容与所需的文本字符串完全匹配。也许可以将output.txt复制到list.seq,然后将list.seq编辑到所需的顺序并再次运行。是的..现在我得到了..谢谢Magoo..它的工作非常完美太棒了,Dbenham..工作得很有魅力..谢谢..:@Dbenham..我试图将输出重定向到一个文件,所以我最后添加了>>output.txt,但每次运行时都会将结果添加到output.txt中,这很明显,但我想避免这种情况,我的意思是,我希望在下次运行时,output.txt中的现有数据都应该被清除。请建议@Sunny-在上次关闭后使用>output.txt。@dbenham。
.I没有,但在这种情况下,output.txt中只有CPULoadPercentage行。此外,如果你能解释一下上面的脚本,我将不胜感激。特别是我在寻找5号功能缺失值为空白的地方。。是在上面的脚本中实现的,如果我想用0或NULL替换所有缺少的值,我可以在上面的脚本中这样做吗?@Sunny-Oops,我忘记了在整个循环显示周围需要一组额外的括号。请参阅我的最新答案。
@echo off
setlocal EnableDelayedExpansion
set i=0
for /F "tokens=1,2" %%a in (file1.txt) do (
   set /A i+=1
   set order[!i!]=%%a
   set info[%%a]=%%b
)

set total2=!order[%i%]!
set /A i-=1
set total1=!order[%i%]!
set /A i-=1

for /F "tokens=1,2" %%a in (file2.txt) do (
   if defined info[%%a] (
      set info[%%a]=!info[%%a]! %%b
   ) else (
      set /A i+=1
      set order[!i!]=%%a
      set info[%%a]=0.00 %%b
   )
)

set /A i+=1
set order[%i%]=%total1%
set /A i+=1
set order[%i%]=%total2%

(
echo OPERATINGSYSTEM       SERVER1    SERVER2
for /L %%i in (1,1,%i%) do (
   for /F %%a in ("!order[%%i]!") do (
      for /F "tokens=1,2" %%b in ("!info[%%a]!") do (
         set "os=%%a                      "
         set "s1=  %%b"
         if "%%c" equ "" (
            set "s2=     0.00"
         ) else (
            set "s2=     %%c"
         )
         echo !os:~0,22!  !s1:~-5!  !s2:~-9!
      )
   )
)
) > output.txt
OPERATINGSYSTEM       SERVER1    SERVER2
Windows                  1.36       4.42
Linux                    2.78       5.76
MacOS                    3.45       6.39
Ubuntu                   4.12       0.00
FreePhysicalMemory      30.12      31.65
Android                  0.00       3.46
TotalVisibleMemorySize  48.00      48.00
CPULoadPercentage         2          4
@echo off
setlocal EnableDelayedExpansion

rem Read info from file1
set i=0
for /F "tokens=1,2" %%a in (file1.txt) do (
   set /A i+=1
   set order[!i!]=%%a
   set info[%%a]=%%b
)

rem Save totals
set total3=!order[%i%]!
set /A i-=1
set total2=!order[%i%]!
set /A i-=1
set total1=!order[%i%]!
set /A i-=1

rem Read/merge info from file2
for /F "tokens=1,2" %%a in (file2.txt) do (
   if defined info[%%a] (
      set info[%%a]=!info[%%a]! %%b
   ) else (
      set /A i+=1
      set order[!i!]=%%a
      set info[%%a]=0.00 %%b
   )
)

rem Return totals to end
set /A i+=1
set order[%i%]=%total1%
set /A i+=1
set order[%i%]=%total2%
set /A i+=1
set order[%i%]=%total3%

rem Format and output information
(
echo OPERATING SYSTEM       SERVER1    SERVER2
for /L %%i in (1,1,%i%) do (
   for /F %%a in ("!order[%%i]!") do (
      for /F "tokens=1,2" %%b in ("!info[%%a]!") do (
         set "os=%%a                      "
         set "s1=  %%b"
         if "%%c" equ "" (
            set "s2=     0.00"
         ) else (
            set "s2=     %%c"
         )
         echo !os:~0,22!  !s1:~-5!  !s2:~-9!
      )
   )
)
) > output.txt
@ECHO OFF
SETLOCAL
SET spaces=                                                         x
SET "line="
FOR /f "delims==" %%a IN ('set list 2^>nul') DO SET "%%a="
FOR /f "tokens=1,2" %%a IN (file1.txt) DO SET list_%%a=%%b
FOR /f "tokens=1,2" %%a IN (file2.txt) DO (
  IF defined list_%%a (CALL SET list_%%a=%%list_%%a%% %%b
   ) ELSE (SET list_%%a=0.00 %%b
  )
)
FOR /f %%v IN (list.seq) DO IF NOT defined list_%%v SET list_%%v=0.00 0.00
FOR /f "tokens=1,2,3delims== " %%a IN ('set list 2^>nul') DO IF "%%c"=="" SET %%a=%%b 0.00
(
 CALL :show L 22 "OPERATING SYSTEM" L 9 "SERVER1" L 12 "SERVER2"
 FOR /f %%v IN (list.seq) DO (
  FOR /f "tokens=2,3,4delims==_ " %%a IN ('set list_%%v') DO SET "suppdec="&CALL :show L 22 %%a R 7 %%b R 9 %%c&SET "list_%%v="
  )
 FOR /f "tokens=2,3,4delims==_ " %%a IN ('set list_ 2^nul') DO SET "suppdec="&CALL :show L 22 %%a R 7 %%b R 9 %%c
)>output.txt
TYPE output.txt

GOTO :EOF

:show
IF "%~3"=="" GOTO output
IF %1==L (SET column=%~3%spaces%) ELSE (SET column=%spaces:~0,-1%%~3%suppdec%)
IF %1==L (CALL SET line=%%line%%%%column:~0,%2%%) ELSE (CALL SET line=%%line%%%%column:~-%2%%)
SHIFT&shift&SHIFT
ECHO "%~3"|FIND "." >nul
IF ERRORLEVEL 1 (SET "suppdec=  ") ELSE (SET "suppdec=")
GOTO show

:output
ECHO %line%
SET "line="
GOTO :eof
Windows
Linux
Absent
MacOS
Ubuntu
Android
FreePhysicalMemory
TotalVisibleMemorySize
CPULoadPercentage
OPERATINGSYSTEM         SERVER1  SERVER2  SERVER3
Android                             3.46
Linux                      2.78     5.76     2.78
MacOS                      3.45     6.39     3.45
Ubuntu                     4.12              4.12
Windows                    1.36     4.42     1.36
FreePhysicalMemory        30.12    31.65    30.12
TotalVisibleMemorySize    48.00    48.00    48.00
CPULoadPercentage             2        4        2
@echo off
setlocal enableDelayedExpansion

:: Clear any existing $ variables
for /f "delims==" %%A in ('"set $ 2>nul"') do set "%%A="

:: Load data
set "cnt=0"
set "blank=                                               "
set  "null=                                           NULL"
set "width=8"
set "labelWidth=22"
set "lineWidth=0"
set "lookup= FreePhysicalMemory:2 TotalVisibleMemorySize:3 CPULoadPercentage:4"
for %%F in (server1.txt server2.txt server3.txt) do (
  set "val=%blank%%%~nF"
  set "$0.OPERATINGSYSTEM=!$0.OPERATINGSYSTEM! !val:~-%width%!"
  for /f "tokens=1,2" %%A in (%%F) do (
    set "test=!lookup:* %%A:=!"
    if "!test!" equ "!lookup!" (set "prefix=$1.") else set "prefix=$!test:~0,1!."
    for %%P in (!prefix!) do (
      if not defined !prefix!%%A (
        for /l %%N in (1 1 !cnt!) do set "%%P%%A=!%%P%%A! !null:~-%width%!"
      ) else if "!%%A!" neq "!cnt!" (
        set "%%P%%A=!%%P%%A! !null:~-%width%!"
      )
      set "val=%blank%%%B"
      set "%%P%%A=!%%P%%A! !val:~-%width%!"
    )
    set /a "%%A=cnt+1"
  )
  set /a cnt+=1, lineWidth+=width+1
)

:: Print results
(for /f "tokens=2* delims=.=" %%A in ('set $') do (
  set "line=%%B !null:~-%width%!"
  set "label=%%A%blank%"
  echo !label:~0,%labelWidth%!!line:~0,%lineWidth%!
))>output.txt