【问题标题】:Creating Each line of text as variable and them constantly changing in a loop in batch将每一行文本创建为变量,并且它们在批量循环中不断变化
【发布时间】:2021-04-01 16:46:41
【问题描述】:

所以我要做的是为多个人创建一个查找,它在文本文件中会显示名称和数字,例如

文本文件示例:

Beth
1234567891
Jay
2134456544

这是我可以解释我正在尝试做什么的最佳方式:

@echo off
set "file=Test1.txt"
setlocal EnableDelayedExpansion
<"!file!" (
    for /f %%i in ('type "!file!" ^| find /c /v ""') do set /a n=%%i && for /l %%j in (1 1 %%i) do (
        set /p "line_%%j="
    )
)

set /a Name=1
set /a Number=2

Echo Line_%Name%> %Name%.txt (Im trying to get this to say line_2 to say 1st line in the text file)
Echo Line_%Number%> %Name%.txt (Im trying to get this to say line_2 to say 2nd line in the text file)

:Start
set /a Name=%Name%+2 (These are meant to take off after 1 so lines 3,5,7,9 so on)
set /a Number=%Number%+2 (These are meant to take off after 2 so lines 4,6,8,10 so on)
Echo Line_%Name%
Echo Line_%Number%
GOTO :Start

所以结果是 在 Beth.txt 中:

 Beth
 1234567891

所以每个名字都是一个文件名和文件的第一行。我稍后会更改它,以便在每个文本文件中添加。

 Name: Beth
 Number: 1234567891

【问题讨论】:

  • 你想达到什么目的?您希望为每个名称创建单独的文本文件,还是希望将输出写入公共文件?
  • Fuzzman,我已经回滚了你的编辑。在收到多个答案后,请不要完全改变您的问题。人们已经竭尽全力帮助您解决已发布的问题,将其更改为您所拥有的程度是不礼貌的,特别是因为我的回答是在您最初发布后的 16 小时后才做出的。我希望您做的是查看发布的一个或多个答案是否达到您在最初提出的问题中预期的结果,并将最合适的答案标记为已接受。然后,如果您有新问题,请发布一个新问题,也许这次是一个真实的问题!

标签: windows loops batch-file variables cmd


【解决方案1】:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=u:\your files"
SET "destdir=u:\your results"
SET "filename1=%sourcedir%\q65417881.txt"

rem make sure arrays are empty
For %%b IN (name number) DO FOR  /F "delims==" %%a In ('set %%b[ 2^>Nul') DO SET "%%a="

rem Initialise counter and entry array
SET /a count=0
SET "number[0]=dummy"

FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
 IF DEFINED number[!count!] (SET /a count+=1&SET "name[!count!]=%%a") ELSE (SET "number[!count!]=%%a")
)

rem clear out dummy entry
SET "number[0]=dummy"

FOR /L %%c IN (1,1,%count%) DO (

 rem replace spaces with dashes
 SET "name[%%c]=!name[%%c]: =-!"

 rem report to console     rem report to console
 ECHO Name: !name[%%c]! Number: !number[%%c]!
 rem generate name.txt file
 (
  ECHO !name[%%c]!
  ECHO !number[%%c]!
 )>"%destdir%\!name[%%c]!.txt"
)
GOTO :EOF

您需要更改分配给sourcedirdestdir 的值以适应您的情况。该列表使用适合我的系统的设置。

我故意在名称中包含空格以确保正确处理空格。

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

从文件中读取的行数据分配给%%anumber[!count!]交替分配。数据保留在这些数组中以供进一步处理使用。

[编辑后将名称中的空格转换为破折号]

【讨论】:

  • 我应该对此进行哪些更改以使其正常工作?我使用文件名 Text1.txt 作为其源。所以我唯一尝试替换的是 SET "filename1=%sourcedir%\q65417881.txt" 与 SET "filename1=%sourcedir%\Test1.txt"
  • 您需要更改分配给 sourcedir 和 destdir 的值以适应您的情况。该清单使用适合我的系统的设置。我不知道您在系统上使用的目录名称,因此您需要将分配给这些变量的值更改为适合您系统的值。
  • 这就是我想要的!我看看我是否可以像上面那样在文件中显示文本
  • 那么我可以在哪里输入 set string=% !name[%%c]: =-% 以使其像在文本文件中一样显示 - 符号而不是空格?
  • 没有真正遵循你想在这里做的事情。如果您想在beth,txt 文件中包含额外数据,请将ECHO !name[%%c]! 更改为ECHO Name: !name[%%c]!(然后按照Number 的弹跳球)。我原本打算使用 ` ECHO Name: !name[%%c]! Number: !number[%%c]!` 会显示这个(该行不是必需的,只显示进度和处理)。除了少数例外(对批处理具有特殊意义的字符)echo !varname! 之间的文本(以及!varname! 之后的任何文本)将按字面意思反刍。
【解决方案2】:

如果我理解正确,您想在每一行前面加上Number: + SPACE,在每一行前面加上Name: + SPACE。为此,您不需要先将每一行存储在一个变量中,您可以使用单个 for /F 循环来逐行读取文件并单独处理每一行。有两种可能:

  1. 使用findstr /N,在每一行之前临时加上一个行号加上:

     @echo off
     rem // Loop through lines and precede each with line number plus `:`:
     for /F "tokens=1* delims=:" %%K in ('findstr /N "^" "Test1.txt"') do (
         rem // Calculate remainder of division by two:
         set /A "MOD=%%K%%2" 2> nul
         rem // Toggle delayed expansion to avoid issues with `!`:
         setlocal EnableDelayedExpansion
         rem // Conditionally return line string with adequate prefix:
         if !MOD! neq 0 (
             endlocal & echo Name: %%L
         ) else (
             endlocal & echo Number: %%L
         )
     )
    

    当一行以 : 开头时,这将失败。

  2. 检查当前行字符串的数值表示是否大于0

     @echo off
     rem // Loop through (non-empty) lines:
     for /F "usebackq delims=" %%L in ("Test1.txt") do (
         rem // Determine numeric representation of current line string:
         set /A "NUM=%%L" 2> nul
         rem // Toggle delayed expansion to avoid issues with `!`:
         setlocal EnableDelayedExpansion
         rem // Conditionally return line string with adequate prefix:
         if !NUM! equ 0 (
             endlocal & echo Name: %%L
         ) else (
             endlocal & echo Number: %%L
         )
     )
    

    当名称以数字开头和/或数字行是 0 时,此操作将失败。

【讨论】:

  • 第一个更符合我的目标。现在我将它用于名称和数字,但也可以用于其他用途。我需要它以他们的名字导出到一个文件中,并且可能会自动向文件中添加一些东西,因为它需要在每个文件中。我希望自己能解决这个问题。
  • So Save like theirname.txt with contents: Line1: Name(来自文件源) Line2(为它保存的每个文件设置) Line3 Number(来自文件源) Line4(设置对于它保存的每个文件,但它们的名称没有空格)第 5 行(为它保存的每个文件设置)第 6 行(为它保存的每个文件设置)
  • 抱歉,@FuzzMan265,我无法关注;你介意edit你的问题并包括预期输入和输出的样本吗?
【解决方案3】:

只是为了发布一些不同的东西:

@SetLocal EnableExtensions DisableDelayedExpansion & (Set LF=^
% 0x0A %
) & For /F %%G In ('Copy /Z "%~f0" NUL') Do @Set "CR=%%G"
@For /F "Tokens=1,2* Delims=:" %%G In ('%__AppDir__%cmd.exe /D/V/C ^
 "%__AppDir__%findstr.exe /NR "^[a-Z]*!CR!!LF![0123456789]" "Test1?.txt" 2>NUL"
 ') Do @(SetLocal EnableDelayedExpansion
    (Set /P "=Name: %%I!CR!!LF!Number: " 0<NUL & Set "_="
        For /F Delims^=^ EOL^= %%J In ('%__AppDir__%more.com +%%H "%%G"') Do @(
            If Not Defined _ Set "_=_" & Echo %%J)) 1>"%%I.txt" & EndLocal)

此文件应与当前工作目录中的Test1.txt 文件一起运行。重要的是除了Test1.txt,没有其他.txt 文件具有相同的基本名称后跟一个其他字符,(例如Test1a.txtTest12.txt。如果您想更改文件名,请记住,您必须在上面的代码中使用? 字符作为其基本名称的后缀,(例如MyTextFile.logMyTextFile?.log

我有机会验证此脚本是否适用于以下示例 Test1.txt 文件:

Beth
1234567891
Jay
2134456544

Bob
2137856514


Jimmy
4574459540



Mary
3734756547


Gemma
6938456114
Albert
0134056504

【讨论】:

    猜你喜欢
    • 2014-12-27
    • 2014-08-03
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    相关资源
    最近更新 更多