批处理文件,用于在特定行的文本文件中重命名目录中的文本文件,除非行空白

时间:2017-02-22 11:59:07

标签: batch-file error-handling

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
cd "C:\Documents and Settings\John\Desktop\New\Interest\f2"
Pushd "C:\Documents and Settings\John\Desktop\New\Interest\f2"
Set Line#=26
Set /A LOfs=24 -1, Len=34 - LOfs
For %%A in (*.txt) do For /F "tokens=1* delims=:" %%B in (
  'Findstr /N ".*" "%%A" ^|Findstr "^%Line#%:"'
) do if %errorlevel% == 0 Set "Line=%%C"&Ren "%%~fA" "!Line:~%LOfs%,%Len%! - %%A!""
Popd

在上面我试图更改目录中文件的文件名,文件位于某个位置。

如果第26行为空,则不做任何操作,也不要更改文件名。

我在某个地方出了问题而且绕圈子走了。

有人可以帮忙吗?

谢谢。

3 个答案:

答案 0 :(得分:0)

您没有说明您的脚本是如何失败的,但我可以看到一些潜在的问题。我也看到了可能的简化。

  • 您当然不需要CDPUSHD
  • 我摆脱了数字变量并在实际代码中包含了数字文字。如果需要,可以恢复变量。
  • 您不需要外部FOR循环。 FINDSTR可以在文件名中使用通配符时搜索多个文件,然后它将包含文件名,然后输出中为:。因此,如果您添加/N选项,则输出的格式为filename:line#:text。然后,您可以调整第二个FINDSTR以仅返回正确的行号。
  • 忽略空行是不够的。只有在第23个字符后面至少有一个有效的文件名字符时,才能使用重命名。文件名不能包含:*?/\<>或{{1} }。 (我可能错过了一些)。我调整了| delims和FOR /F搜索以进行补偿。
  • 对于FINDSTR这样的变量扩展,如果它们包含%%A并且启用了延迟扩展,则会损坏值。 !是文件名中的有效字符。因此,必须在循环内打开和关闭延迟扩展。

我相信以下内容会做你想要的。下面的代码将简单地回显重命名命令。一旦它给出了正确的结果,就移除!之前的ECHO

ren

答案 1 :(得分:0)

与Daves略有不同的方法:

@Echo Off

Set "SrcDir=%UserProfile%\Desktop\New\Interest\f2"
Set "Mask=*.txt"
Set "Line#=26"
Set "LOfs=23"
Set "Len=11"

If /I Not "%CD%"=="%SrcDir%" Pushd "%SrcDir%"2>Nul&&(Set _=T)||Exit/B

For /F "Tokens=1-2* Delims=:" %%A In ('FindStr/N "^" "%Mask%" 2^>Nul'
) Do If "%%B"=="%Line#%" If Not "%%~C"=="" (Set "Line=%%C"
    SetLocal EnableDelayedExpansion
    If Not "!Line:~%LOfs%,%Len%!"=="" (
        If Not Exist "!Line:~%LOfs%,%Len%! - %%A" (
            Ren "%%A" "!Line:~%LOfs%,%Len%! - %%A"))
    EndLocal)

If "_"=="T" PopD

答案 2 :(得分:0)

此方法不需要findstr.exe也不需要切换setlocal/endlocal,因此它应该运行得更快。此外,它还可以避免重新处理任何已重命名的文件,并通过for %%A结合for /F命令更改普通dir

@Echo off
SetLocal EnableDelayedExpansion

cd "C:\Documents and Settings\John\Desktop\New\Interest\f2"
Set /A Line#=26, LOfs=24 -1, Len=34 - LOfs

For /F "delims=" %%A in ('dir /A-D /B *.txt') do (

   rem Read the desired line from this file
   (for /L %%i in (1,1,%Line#%) do set "Line=" & set /P "Line=") < "%%A"

   if defined Line ECHO Ren "%%~fA" "!Line:~%LOfs%,%Len%! - %%A"

)

另请注意,当此Batch文件结束时,当执行setlocal命令时,当前目录会自动恢复到当前目录,因此也不需要pushd/popd命令。