我正在努力进行以下搜索。 我需要查找错误文件夹中错放的文件。我有以下测试结构(实际上它是hudreds文件夹):
C:\test2\John\John_phone.txt
C:\test2\Mary\John_address.txt
C:\test2\Mary\Mary_address.txt
C:\test2\Mary\Mary_phone.txt
C:\test2\Mary\Peter_address.txt
文件John_address.txt和Peter_address.txt放错在Mary的文件夹中。我想检查Mary的文件夹中是否存在任何放错位置的文件,并将它们列在一个单独的日志文件中。因此,对于上面的示例,日志将包含两个错放文件的名称(路径),决定标识符是人员的名称。我有这段代码:
@echo off
cls
set /p name="Specify the name: "
::forfiles /p "%CD%\%name%" /s /m *.* /c "cmd /c echo @path">>log.txt
forfiles /p "%CD%\%name%" /s /m "| findstr /i /v "\*%name%*"" /c "cmd /c echo @path">>log.txt
pause
forfiles的注释行有效(列出文件夹中的所有文件),所以我遇到了findstr的问题:错误:找不到类型为“| findstr / i / v * Mary *”的文件。 带有findstr的/ v开关应该找到所有不包含指定名称的文件,但显然我在使用它作为forfiles的输入时做错了。 我不想使用dir命令,因为它列出了其他信息,我需要将输出集成到更大的日志文件中(我只需要获取错放文件的路径)。
感谢任何帮助。 感谢。
编辑:如果正确修改了正确的文件名,编写代码会更容易吗?
All_data_%NAME%_new.txt
名称前后的内容将被修复,文件名的这种格式将是唯一正确的选项,因此必须报告任何其他内容。
答案 0 :(得分:1)
一个简单的解决方案
@echo off
setlocal enableextensions disabledelayedexpansion
set "rootFolder=c:\test2"
( for /d %%z in ("%rootFolder%\*"
) do for %%y in ("%%~fz\*"
) do for /f "tokens=1 delims=_" %%a in ("%%~ny"
) do if /i not "%%~nxz"=="%%a" echo %%~fy
) > log.txt
如果文件的名称以与文件夹名称相同的字符串开头,这将迭代每个文件夹下的文件。
已编辑原始提议的解决方案无法按预期工作,因此已删除
已编辑 - 由于文件名没有固定格式,且文件夹名称可以在任何地方,可以使用
@echo off
setlocal enableextensions disabledelayedexpansion
set "rootFolder=c:\test2"
rem create a temporary file to hold the patterns to match against the list
rem of files to determine if it is correctly placed
set "patterns=%temp%\%~nx0.%random%.tmp"
> "%patterns%" (
for /d %%a in ("%rootFolder%\*") do echo(\\%%~nxa\\[^^\\]*%%~nxa[^^\\]*
)
rem Get the list of files, and filter to only get those that do not match
rem the generated patterns
dir /s /b /a-d "%rootFolder%\*" ^
| findstr /r /i /c:"%rootFolder:\=\\%\\[^\\]*\\." ^
| findstr /r /i /e /v /g:"%patterns%" ^
> log.txt
rem Patterns file is no longer needed
del "%patterns%" >nul 2>nul
答案 1 :(得分:0)
这应该有帮助,只要比较是区分大小写的
for /f "delims=.'_\ tokens=2,3,*" %%a in ('forfiles /s /m *.txt /c "cmd /c echo @relpath"') do if NOT "%%a"=="%%b" @echo "%%a\%%b_%%c