批处理脚本未显示全部输出

时间:2019-07-05 15:27:06

标签: batch-file

我有一个带有一些服务器名称的输入文本文件

我正在尝试用|替换每台服务器的“换行”。

abcdef.abcdef.abcdef
testing
example

cmd.exe中执行时,我的脚本无法解析输入文件中的所有行。说,如果我的输入文件中有1000个服务器,则可以在“命令提示符”窗口中看到大约500个服务器的输出。

@echo off
setlocal enableextensions
SETLOCAL EnableDelayedExpansion
rem Purpose - To remove domain name of servers and convert line by line strings to | seperated strings.

type nul > Del_Output.txt

for /f "tokens=1 delims=." %%a in (Downtime.txt) do (

  echo(%%a>> Del_Output.txt
)
type Del_Output.txt

rem Initialize the output line
set "line="

rem Catenate all file lines in the same variable separated by "|"
for /F "delims=" %%a in (Del_Output.txt) do set "line=!line!|%%a"

rem Show final line, removing the leading "|"

rem echo !line:~1!>FinalOutput.txt
echo !line:~1!
rem type "C:\Users\AAithal\Desktop\MoogSoft_Downtime\FinalOutput.txt"
ENDLOCAL

有关此问题的一些指示将非常有帮助。

2 个答案:

答案 0 :(得分:2)

这应该有效:

@echo off
setlocal

set "first="
< nul (
for /F "delims=." %%a in (Downtime.txt) do (
   if not defined first (
      set "first=1"
      set /P "=%%a"
   ) else (
      set /P "=|%%a"
   )
)
echo/
) > Output.txt

正如其他人已经指出的那样,批处理变量的最大长度为8192个字符,因此所有超过该大小的名称都不会包含在您的代码中...

解决方案是不使用变量来收集输出。 set /P命令允许输出结尾不带LF的字符串,因此输入行仅连接在长输出行中。

答案 1 :(得分:1)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q56905805.txt"

SET "outline="
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
 FOR /f "tokens=1*delims=." %%i IN ("%%a") DO IF "%%j"=="" (
  SET "outline=!outline!|%%a"
 ) ELSE (
  IF DEFINED outline ECHO !outline!
  SET "outline=%%i"
 )
)
IF DEFINED outline ECHO !outline!
GOTO :EOF

您需要根据自己的情况更改sourcedir的设置。清单使用适合我系统的设置。

我使用了一个名为q56905805.txt的文件,其中包含您的数据用于测试。

usebackq选项是必需的,因为我选择在源文件名周围添加引号。

将每行分配给%%a,然后用定界符重新解析它。它包含定界符,它是一台新服务器,因此输出前一个并重新启动,否则使用所需的分隔符进行累加。