批处理文件:如何连接文本文件中的每一行?

时间:2014-09-09 18:46:13

标签: batch-file cmd text-files concatenation

我有一个文本文件,每行都有文字。我希望能够将每一行放在一条长行中以及一个空格。所以,如果文本文件有:

Bob
Jack
Sam

我希望结果是

Bob Jack Sam

以下是我正在处理的两种方法,但我遇到了困难。括号[]中的任何内容都意味着我知道语法是完全错误的;我只是把它放在那里展示我的思考过程。评论部分只是我的实验,我留下了他们,以防任何人想要评论他们会做什么/为什么他们做他们做的事情。

方法1:

@echo off
SETLOCAL EnableDelayedExpansion
SET count=1
FOR /F "tokens=* delims= usebackq" %%x IN ("afile.txt") DO (
SET var!count!=%%x
for %%a in (!count!) do (
!var%%a! = !var%%a! & " "
echo !var%%a!
)
SET /a count=!count!+1
echo !count!
)

::echo !var1! !var2! !var3!
start "" firefox.exe !var%%a!-1

ENDLOCAL

::echo "endlocal" %var1% %var2% %var3%

方法2:

@echo off
SETLOCAL EnableDelayedExpansion
SET count=1
FOR /F "tokens=* delims= usebackq" %%x IN ("afile.txt") DO (
SET var!count!=%%x
call echo %%var!count!%%

SET /a count=!count!+1
echo !count!
)

::echo !var1! !var2! !var3!
start "" firefox.exe ^
[i = 1]
[for i to !count! do (]
call echo %%var!count!%% & " " & " "^

ENDLOCAL

::echo "endlocal" %var1% %var2% %var3%

4 个答案:

答案 0 :(得分:3)

如果您只有三个值,则可以直接从文件中检索它们

< input.txt (
    set /p "line1="
    set /p "line2="
    set /p "line3="
)
set "var=%line1% %line2% %line3%"
echo("%var%"

如果您不知道值的数量,请使用for /f命令读取行并将内容连接到变量中。

@echo off
    setlocal enableextensions enabledelayedexpansion

    set "var="
    for /f "usebackq delims=" %%a in ("input.txt") do set "var=!var!%%a "
    echo("%var%"

但是如果数据可以包含感叹号,则延迟扩展状态将删除它们(以及由它们围绕的文本)。为避免这种情况,可以使用

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "var="
    for /f "usebackq delims=" %%a in ("input.txt") do (
        setlocal enabledelayedexpansion
        for /f "tokens=* delims=¬" %%b in ("¬!var!") do endlocal & set "var=%%b%%a "
    )
    echo("%var%"

使用setlocal/endlocal和内部for来避免!字符出现问题

或者你可以试试这样的东西

@echo off
    setlocal enableextensions disabledelayedexpansion

    for /f "delims=" %%a in ('
        "<nul cmd /q /c "for /f "usebackq delims=" %%z in ("input.txt"^) do (set /p ".=%%z "^)""
    ') do set "var=%%a"

    echo("%var%"

它运行一个cmd实例来输出输入行,因为只有一个输出行(<nul set /p用于输出没有换行的数据,所以所有数据都在同一行)。它包含在for中以检索变量

中的输出

答案 1 :(得分:0)

这对你有用吗?

@echo off

SET var=
SETLOCAL EnableDelayedExpansion
FOR /f %%i in (afile.txt) DO (
   SET var=!var!%%i 
)
echo !var!
ENDLOCAL

请注意SET var=!var!%%i[Space Here]之后有一个空格来分隔每行中的每个单词

修改 如果要在循环中显示当前值,只需打印%%i并且不连接。 FOR循环结束后,它将打印分配给变量

的最后一个值
@echo off

SET var=
SETLOCAL EnableDelayedExpansion
for /f %%i in (input.txt) do (
   SET var=%%i 
   echo !var!
)
echo %var%

将打印:

Bob
Jack
Sam
Sam

答案 2 :(得分:0)

试试这个:发布后修改。

@Echo off
Set "File=Recent_Log.txt"
Set "Output=My_Log.txt"

(
  For /F %%F in (%File%) Do (
    Set /p ".=%%~F "
  )
) > "%Output%" < Nul

Goto :Eof

答案 3 :(得分:0)

因为这是Google搜索后的第一个链接,所以我发布了我的解决方案(Windows 7/10 .bat):

for %%f in (h:\blaba\*.*) do (type "%%f" & echo.) >> h:\sfsdf\dd.txt

注意:当您的目录/文件名包含空格时,请使用双引号。