输出文件名没有扩展名,文件夹名称使用批处理文件到csv文件

时间:2013-12-04 19:13:35

标签: batch-file

我需要获取没有文件扩展名的文件名,文件夹名称输出到csv文件。我可以使用以下方式获取文件名和文件夹名称:

@ECHO OFF
SETLOCAL
PUSHD "%~1"
FOR /f "delims=" %%i IN ("%cd%") DO SET directory=%%~nxi
(
FOR /f "delims=" %%i IN ('dir /b /a-d /on') DO (
SETLOCAL enabledelayedexpansion
ECHO "%%i","!directory!"
endlocal
)
)>filelist.csv

如何重写此代码以删除文件扩展名,如果有子文件夹,它也会获取子文件夹名称?

2 个答案:

答案 0 :(得分:1)

@echo off
    setlocal enableextensions disabledelayedexpansion
    if not "%~1"=="" (
        (for /f "tokens=*" %%i in ('dir /s /b /on "%~1\*"') do (
            set "file=%%~dpni"
            setlocal enabledelayedexpansion
            echo(!file:%~dp1=!
            endlocal
        )) > filelist.csv
    ) else (
        call "%~f0" "%cd%"
    )
    endlocal

不确定最终格式。尝试并发表评论。

已编辑 - 处理Andriy M公开的案件

答案 1 :(得分:0)

@echo off
setLocal
pushd "%~1"
set "cur_path=%cd:~2%"
setLocal enableDelayedExpansion
FOR /f "delims=" %%i IN ('dir /b /s /a-d /on') DO (
    SET "file_path=%%~dpni"
    SET "file_path=!file_path:~2!"
    SET "file_path=!file_path:%cur_path%=!"
    ECHO "!file_path!","%%~di%cur_path%"
)
endLocal
endLocal

修改 使用额外的~替换(相对较慢 - 可以使用宏进行优化...):

@echo off
pushd .
set "cur_path=%cd:~2%"
call :wavereplacer "%cur_path%" "-" nw_cur_path
setlocal enableDelayedExpansion
FOR /f "delims=" %%i IN ('dir /b /s /a-d /on') DO (
    SET "file_path=%%~dpni"
    SET "file_path=!file_path:~2!"
    SET "file_path=!file_path:%cur_path%=!"
    CALL :wavereplacer "!file_path!" "-" file_path  
    ECHO "!file_path!","%%~di%nw_cur_path%"
)

endlocal

endlocal

goto :eof

:wavereplacer String Replacer [RtnVar]
setlocal
rem  the result of the operation will be stored here
set "result=#%~1#"
set "replacer=%~2"
call :strlen0.3 result wl
call :strlen0.3 replacer rl

:start

  set "part1="
  set "part2="

  rem splitting the string on two parts
  for /f "tokens=1* delims=~" %%w in ("%result%") do (
   set "part1=%%w"
   set "part2=%%x"
  )

  rem calculating the count replace strings we should use
  call :strlen0.3 part1 p1l
  call :strlen0.3 part2 p2l
  set /a iteration_end=wl-p1l-p2l

  rem creating a sequence with replaced strings
  setlocal enableDelayedExpansion
  set "sequence="
  for /l %%i in (1,1,%iteration_end%) do (
   set sequence=!sequence!%replacer%
  )
  endlocal & set "sequence=%sequence%"

  rem adjust the string length
  set /a wl=wl+iteration_end*(rl-1)

  rem replacing for the current iteration
  set result=%part1%%sequence%%part2%
  rem if the second part is empty the task is over
  if "%part2%" equ "" (
   set result=%result:~1,-1%
   goto :endloop
  )


  goto :start

:endloop
endlocal & if "%~3" neq "" (set %~3=%result%) else echo %result%
exit /b

:strlen0.3  StrVar  [RtnVar]
  setlocal EnableDelayedExpansion
  set "s=#!%~1!"
  set "len=0"
  for %%A in (2187 729 243 81 27 9 3 1) do (
   set /A mod=2*%%A
   for %%Z in (!mod!) do (
      if "!s:~%%Z,1!" neq "" (
         set /a "len+=%%Z"
         set "s=!s:~%%Z!"

      ) else (
         if "!s:~%%A,1!" neq "" (
            set /a "len+=%%A"
            set "s=!s:~%%A!"
         )
      )
   )
  )
  endlocal & if "%~2" neq "" (set %~2=%len%) else echo %len%
exit /b