【问题标题】:Batch file variable echoing variable name and not contained text批处理文件变量回显变量名称且不包含文本
【发布时间】:2017-10-31 11:45:53
【问题描述】:

我对批处理文件比较陌生,这就是我想要做的:

  1. 我有一个包含多个 csv 文件的文件夹,名为:

    Thu_Oct_26_11-12-07_BST_2017+testa.csv
    Thu_Oct_26_11-12-07_BST_2017+testb.csv
    

    文件中的文本以| 分隔,即

    Peg|Adoption|Indonesia|1980|
    Peg|Adoption|Indonesia|1981|
    
  2. 我有一个批处理代码,将文件名放在 csv 文件中每一行的前面

    ::add filename
    for /f %%a in ('dir /b ^"C:\Temp\CSV\Countries\*.csv^"'
    ) do (
    for /f "tokens=*" %%b in (%%a
    ) do echo %%a^|%%b >> "C:\Temp\CSV\Countries\import_temp\%%a")
    pause
    
  3. 上面的方法是将整个名称添加到行的前面,但我只想将文件名的日期部分添加到行中。我尝试使用:~0,10%%a 中选择一个子字符串,但这仍然会粘贴整个字符串

    ::add filename
    for /f %%a in ('dir /b ^"C:\Temp\CSV\Countries\*.csv^"'
    ) do (
    for /f "tokens=*" %%b in (%%a
    ) do echo %%a:~0,10^|%%b >> "C:\Temp\CSV\Countries\import_temp\%%a")
    pause
    

    我也尝试设置一个等于%%a 子字符串的新变量,但这会打印%c 而不是文件名的第一部分

    ::add filename
    for /f %%a in ('dir /b ^"C:\Temp\CSV\Countries\*.csv^"'
    ) do (
    set c=%%a:~0,10
    for /f "tokens=*" %%b in (%%a
    ) do echo %%c^|%%b >> "C:\Temp\CSV\Countries\import_temp\%%a")
    pause
    

有人能指出我做错了什么吗?

【问题讨论】:

  • 您需要在 FOR 循环的主体内使用delayed environment variable expansion。字符串替换仅适用于 environment 变量,但不适用于 loop 变量。用%%a 引用的a 是一个循环 变量。在命令提示符窗口set /?for /? 中运行并阅读这两个命令的完整输出帮助。顺便说一句:^ 不需要留给"。并且for %%a in ("C:\Temp\CSV\Countries\*.csv") do (也可以在这里使用,而无需在后台单独的命令进程中执行DIR

标签: windows batch-file variables for-loop


【解决方案1】:
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
MD "%sourcedir%\import_temp" 2>NUL
::add filename
for /f %%a in ('dir /b "%sourcedir%\*.csv"'
) do (
 for /f "tokens=1-3delims=_" %%B in ("%%a"
 ) do echo %%B_%%C_%%D^|%%a >> "%sourcedir%\import_temp\%%a"
)

GOTO :EOF

您需要更改sourcedir 的设置以适应您的情况。

我添加了一个md 来强制生成import_temp 子目录。 2>nul 用于抑制对目录已存在的投诉。

为了区别,我改变了内循环中使用的元变量的大小写。使用_ 作为分隔符将字符串%%a 分析为标记并选择前3 个标记将%%a 中的每个子字符串分配给%%B...%%D,因此所需要做的就是重新组合日期并将其与仅包含文件名的%%a 连接起来。请注意,for 循环的元变量是cmd 区分大小写的少数几个地方之一。

不需要在dir 中转义" 的插入符号。

【讨论】:

  • 谢谢,这很有效,就像 ::add filename for /f %%a in ('dir /b "C:\Temp\CSV\Countries*.csv"' ) 一样 (Setlocal EnableDelayedExpansion设置 c=%%a 设置 c=!c:~0,28! for /f "tokens=*" %%b in (%%a ) do ( echo !c!^|%%b >> "C: \Temp\CSV\Countries\import_temp\%%a")) 暂停
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 2016-11-20
  • 2017-06-11
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多