在Windows批处理编程中读取文件名

时间:2011-07-12 13:10:03

标签: windows batch-file

我想在windows批处理编程中读取文件的名称。我正在尝试使用不同的方法,但失败请求帮助。

下面给出了情景。

我在文件夹中有不同的文件,但文件名的长度对于所有文件都是相同的。 E.g。

1000342578_30062011.PDF
1000342329_30062011.PDF

我只是想在_之后和.PDF之前(例如30062011)将部分保存在变量中。

以下只是尝试,但我无法通过。

@echo off
echo.Date   : %date%
echo.Year   : %date:~10,4%
dir /s /b C:\Users\zeeshando\Desktop\*.txt
for %%x in (c:\temp\*.xls) do echo %%x 
lfnfor off 
for %%x in (*.*) do echo %%x > filelist.txt 
PAUSE
for %i in (C:\Users\zeeshando\Desktop) do 
    echo %~ni
PAUSE

更新

我目前的代码,基于@Alex K.的回答:

@setlocal enabledelayedexpansion
for %%x in (C:\Hi\*.*) do (
    set fn=%%x
    set fn=!fn:~22,8!
    echo !fn!
    call:handler
)
goto:eof

:handler
echo !fn!
copy C:\Hi\*.* E:\!fn!
goto:eof


PAUSE

但它不是复制文件。请检查上面的代码。

3 个答案:

答案 0 :(得分:2)

您可以使用_和来在for循环中执行此操作。作为分隔符,像这样:

FOR /F "tokens=2 delims=_." %%i IN ('DIR /b C:\Users\zeeshando\Desktop\*_*.*') DO ECHO %%i

答案 1 :(得分:1)

@ECHO OFF
SET "destpath=destinationPath"
FOR %%f IN (sourcePath\*.*) DO CALL :process "%%f"
GOTO :EOF

:process
SET srcfile=%1
SET "name=%~n1"
SET "name=%name:*_=%"
COPY %srcfile% "%destpath%\%name%"

SET "name=%~n1"行从完整路径中提取没有扩展名的名称。

SET "name=%name:*_=%"行会删除_字符及其前面的所有字符name,并将结果存储回name

最终,在执行COPY命令之前,name仅包含原始文件名中_与扩展名之间的那部分。

答案 2 :(得分:0)

由于它们具有固定长度,因此您可以使用:~startpos,len语法;

set fn=1000342578_30062011.PDF
set fn=%fn:~11,8%
echo %fn%

>30062011

在for循环中;

setlocal enabledelayedexpansion
for %%x in (*.*) do (
    set fn=%%x
    set fn=!fn:~11,8!
    call:handler
)
goto:eof

:handler
    echo !fn!
goto:eof