在 Batch 中寻找文件名的两个字符串
Looking for two strings for file names in Batch
这应该很简单..但是,我不明白..
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /r "D:" %%X IN (*) DO (
FOR /F %%G IN (%%~nxX) DO for %%P in (server.sams.log* server.tims.log*) do ECHO %%P
)
ENDLOCAL
因此,我要查找的是文件名中包含 sams 或 tims 的任何文件,但忽略文件夹中的任何其他文件。
而且,是的,我知道我可以做到以下几点..
FOR /r "D:" %%X IN (server.sams* server.tims*) DO (...
但我还有其他文件名要比较..
我也考虑过比较部分字符串,但似乎也行不通。是的,它似乎只能单独使用 sams 或 tims,我尝试使用 GEQ、LSS 等的各种组合.没有成功。
https://superuser.com/questions/541575/comparing-part-of-a-filename-in-a-windows-batch-file
谢谢。
如果要测试文件是否包含可能列表中的子字符串,最简单的方法是使用 findstr
和 conditional execution。
SETLOCAL
FOR /r "D:" %%X IN (*) DO (
findstr /i "sams tims bobs jims steves" "%%X" >NUL && (
echo %%X: Match found!
) || (
echo %%X: No match.
)
)
或者,甚至更简单,您可以完全消除所有 for
循环并简单地使用 findstr /s /i "sams tims etc" *
.
无论如何,您当前的代码无法正常工作,因为您的 for %%P
循环只是回显。它实际上并没有比较任何东西。如果您更喜欢使用嵌套循环来检查文件名中每个子字符串是否存在,请将您的代码更改为如下所示:
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /r "D:" %%X IN (*) DO (
FOR /F %%G IN (%%~nxX) DO (
set "line=%%X"
for %%P in (server.sams.log server.tims.log) do (
if /i not "!line!"=="!line:%%P=!" (
ECHO %%P
)
)
)
)
ENDLOCAL
@rojo - 我们甚至不需要额外的 %%G "FOR" 循环,因为它可以正常工作。
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /r "D:" %%X IN (*) DO (
Set FileName=%%~nxX
for %%P in (sams tims) do (
if /i not "!FileName!"=="!FileName:%%P=!" (
ECHO %%P "!FileName!"
)
)
)
ENDLOCAL
您当然可以将 %%P 替换为 %%G,但您不需要两者..:)
对此有帮助的是,您可以执行多个操作,例如:
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /r "D:" %%X IN (*) DO (
Set FileName=%%~nxX
for %%P in (sams tims) do (
if /i not "!FileName!"=="!FileName:%%P=!" (
ECHO %%P "!FileName!"
)
for %%P in (jims johns) do (
if /i not "!FileName!"=="!FileName:%%P=!" (
ECHO %%P "!FileName!"
)
)
)
ENDLOCAL
感谢您为我指明正确的方向!!
这应该很简单..但是,我不明白..
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /r "D:" %%X IN (*) DO (
FOR /F %%G IN (%%~nxX) DO for %%P in (server.sams.log* server.tims.log*) do ECHO %%P
)
ENDLOCAL
因此,我要查找的是文件名中包含 sams 或 tims 的任何文件,但忽略文件夹中的任何其他文件。
而且,是的,我知道我可以做到以下几点..
FOR /r "D:" %%X IN (server.sams* server.tims*) DO (...
但我还有其他文件名要比较..
我也考虑过比较部分字符串,但似乎也行不通。是的,它似乎只能单独使用 sams 或 tims,我尝试使用 GEQ、LSS 等的各种组合.没有成功。 https://superuser.com/questions/541575/comparing-part-of-a-filename-in-a-windows-batch-file
谢谢。
如果要测试文件是否包含可能列表中的子字符串,最简单的方法是使用 findstr
和 conditional execution。
SETLOCAL
FOR /r "D:" %%X IN (*) DO (
findstr /i "sams tims bobs jims steves" "%%X" >NUL && (
echo %%X: Match found!
) || (
echo %%X: No match.
)
)
或者,甚至更简单,您可以完全消除所有 for
循环并简单地使用 findstr /s /i "sams tims etc" *
.
无论如何,您当前的代码无法正常工作,因为您的 for %%P
循环只是回显。它实际上并没有比较任何东西。如果您更喜欢使用嵌套循环来检查文件名中每个子字符串是否存在,请将您的代码更改为如下所示:
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /r "D:" %%X IN (*) DO (
FOR /F %%G IN (%%~nxX) DO (
set "line=%%X"
for %%P in (server.sams.log server.tims.log) do (
if /i not "!line!"=="!line:%%P=!" (
ECHO %%P
)
)
)
)
ENDLOCAL
@rojo - 我们甚至不需要额外的 %%G "FOR" 循环,因为它可以正常工作。
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /r "D:" %%X IN (*) DO (
Set FileName=%%~nxX
for %%P in (sams tims) do (
if /i not "!FileName!"=="!FileName:%%P=!" (
ECHO %%P "!FileName!"
)
)
)
ENDLOCAL
您当然可以将 %%P 替换为 %%G,但您不需要两者..:)
对此有帮助的是,您可以执行多个操作,例如:
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /r "D:" %%X IN (*) DO (
Set FileName=%%~nxX
for %%P in (sams tims) do (
if /i not "!FileName!"=="!FileName:%%P=!" (
ECHO %%P "!FileName!"
)
for %%P in (jims johns) do (
if /i not "!FileName!"=="!FileName:%%P=!" (
ECHO %%P "!FileName!"
)
)
)
ENDLOCAL
感谢您为我指明正确的方向!!