@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行为空,则不做任何操作,也不要更改文件名。
我在某个地方出了问题而且绕圈子走了。
有人可以帮忙吗?
谢谢。
答案 0 :(得分:0)
您没有说明您的脚本是如何失败的,但我可以看到一些潜在的问题。我也看到了可能的简化。
CD
和PUSHD
FOR
循环。 FINDSTR可以在文件名中使用通配符时搜索多个文件,然后它将包含文件名,然后输出中为:
。因此,如果您添加/N
选项,则输出的格式为filename:line#:text
。然后,您可以调整第二个FINDSTR
以仅返回正确的行号。:
,*
,?
,/
,\
,<
,>
或{{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
命令。