【问题标题】:Reading empty values in "for" command in a windows batch file在 Windows 批处理文件中的“for”命令中读取空值
【发布时间】:2010-08-26 12:53:30
【问题描述】:

我对 windows 中的“for”批处理命令有疑问。

我有一个名为 keys.txt 的文件,其中包含这一行..

键、值、x86、windows7

我想解析这一行并将 4 个逗号分隔的变量存储在 4 个变量中。我通过以下 Windows 批处理脚本来实现。

 for /F "tokens=1,2,3,4* delims=," %%i
 in (keys.txt) do (

    echo first is %%i

    echo second is %%j

    echo third is %%k

    echo fourth is %%l

    echo rest is %%m

    echo -------------  

 )

但是,当我将 keys.txt 修改为

键、值、windows7

第三个变量打印为 windows7。我希望第三个变量为空,第四个变量为 windows7。如果我像这样在两个逗号之间留一个空格

键、值、、windows7

然后它将第三个变量打印为空,将第四个变量打印为 Windows7。

任何人都知道我怎样才能使较早的情况(即没有空格的情况)也能正常工作吗?

【问题讨论】:

  • 为什么要使用批处理来解析文件?你还有其他选择吗?喜欢使用真正的文件解析器(语言)?如果你不能下载和使用东西,你可以使用vbscript,它更擅长做这些工作。
  • 其实有很多代码是用批处理脚本写的,所以把整个东西迁移到vbs会是一项艰巨的任务。但是,我找到了另一种选择,即编写一个 vbs 文件,该文件将创建一个包含 set var=value 行列表的文件,然后从父批处理文件中调用此批处理文件。

标签: batch-file null for-loop cmd


【解决方案1】:

试试这个。想法来自here
该脚本预处理每一行,将文本#NUL# 分配给每个空槽。之后您可以忽略 #NUL# 值。

cls
setlocal enabledelayedexpansion
@echo off
for /f "tokens=*" %%X in (keys.txt) do (
    set "work=%%X"
    :: fill empty fields with "#NUL#" ...
    :: but do it twice, just in case consecutive fields are empty
    for /l %%i in (1,1,2) do set "work=!work:,,=,#NUL#,!"
    for /F "tokens=1,2,3,4* delims=," %%i in ("!work!") do (
echo first is %%i
echo second is %%j
echo third is %%k
echo fourth is %%l
echo rest is %%m
echo -------------  
))

HTH

【讨论】:

    【解决方案2】:

    for 旨在在某些系统上不保留空/空令牌,因此将下一个下一个令牌分配给占位符(只要它也不是空/空)。在某些版本的 Windows™ 上打印带有前导空格或空白行的文本时也会发生这种情况。 要解决此问题,请预处理数据并在空数据中填充一些值,例如。空间(正如您所试验的那样)来保留所有令牌。

    for /f "delims=" %a in (test.1) do set data=%a& set data=!data:,=","!& for /f "tokens=1-4 delims=," %i in ("!data!") do set a=%i-%j-%k-%l& echo !a:"=!
    

    上述代码预处理类似于 CSV 格式的数据,这也适用于同一“单元格”内包含空格的数据。 例如。输出:key-value--windows 7

    如果您的数据包含分隔符 , 并且您希望将其保留为数据的一部分,则更改 for 中的分隔符或在预处理期间对其进行转义。

    更新(批量处理的实际应用):
    使用这种方法,您还可以自动填充(通用)数据,例如。如果您正在处理多个文件并且要从模板文件中读取文件名,那么您可以创建一个模板文件并从中读取文件名,而不是在命令提示符下为每个要处理的文件键入文件名。

    如果他们中的大多数都有一个共同的扩展名,例如。 .txt,然后只需输入 ,,(空白数据),而不是每次都输入 .txt,如下所示:

    file1,,
    file 2,,
    file 3la,,
    different file,.pdf
    

    然后在您的代码中,,, 的空格将被预填充 .txt(节省创建模板文件的时间)。

    这是在将文件名输入到主进程代码之前预处理文件名的代码:

    for /f "delims=" %a in (test.1) do set data=%a& set data=!data:,=","!& for /f "tokens=1,2 delims=," %i in ("!data!") do (
    REM replace empty cells with ".txt"
    echo %j | find "." >nul && (set j=%j) || set j=.txt
    set data=%i!j! & echo !data:"=!
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多