批处理文件变量回显变量名称而不包含文本

时间:2017-10-31 11:45:54

标签: windows batch-file variables for-loop

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

  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. 上面的工作是将整个名称添加到行的前面,但我只想将文件名的日期部分添加到行中。我尝试使用%%a:~0,10中选择一个子字符串,但这仍然会粘贴整个字符串

    ::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
    
  4. 是否有人能够表明我做错了什么?

1 个答案:

答案 0 :(得分:0)

@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的插入符号。