我有一个带有一些服务器名称的输入文本文件
我正在尝试用|
替换每台服务器的“换行”。
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
有关此问题的一些指示将非常有帮助。
答案 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
,然后用定界符重新解析它。它包含定界符,它是一台新服务器,因此输出前一个并重新启动,否则使用所需的分隔符进行累加。