Я пишу пакетный файл. часть программы будет сравнивать список файлов в «исходной» папке. С содержимым списка в текстовом файле.
Я перебираю каждый файл в папке и ищу его имя файла в текстовом файле, используя FINDSTR.
Все работает до тех пор, пока в исходной папке нет имени файла, которого нет в текстовом файле.
код findstr:
for /f %%o in ('findstr %name% old.txt') do (
echo o=%%o >> result.txt
if %%o==%name% (
echo %name% exists
) ELSE (
echo %name% does not exists
)
)
Опять же, проблема возникает, когда FINDSTR ищет имя файла, которого нет в текстовом файле.
когда он достигает этой точки, он выводит переменную %%o как «%o» и ничего не выводит. Таким образом, он ничего не отправляет в results.txt.
Это не вызовет изменения ERRORLEVEL, но и ничего не выведет. Я попытался вывести уровни ошибок, но они также пусты. Я просто не понимаю, что делает FINDSTR в этом случае.
ПОЛНЫЙ пакетный файл: (это мой первый файл. Простите за любые ошибки)
::return the raw (/b) list of files
FORFILES /p %~dp0source\ /s /m "*.cr2" /C "cmd /c echo @path" > new.txt
::pull file path for each file and send to subroutine
for /f %%n in ('FORFILES /p %~dp0source\ /s /m "*.cr2" /C "cmd /c echo @path"') do (
call :dequote %%n
)
::subroutine for removing quotes
::and returning the filename, extension, and path
:dequote
set fullPath=%~f1
set fileName=%~n1
set fileExt=%~x1
set filePath=%~dp1
set name=%fileName%& set npath=%filePath%& set ext=%fileExt%& set fpath=%fullPath%
echo %fpath%
echo %npath%
echo %name%
echo %ext%
for /f %%o in ('findstr %name% old.txt') do (
echo o=%%o >> result.txt
if %%o==%name% (
echo %name% exists
) ELSE (
echo %name% does not exists
)
)
Это происходит только с последним именем файла, отправленным на findstr. Любые предложения или направления будут очень признательны. Я пробовал и читал все, что попадалось под руку.
Спасибо за уделенное время.
ОБНОВЛЕНИЕ: 9-9-15
Вот рабочий окончательный пакетный файл, который я создал с помощью справки на этой странице. Он создает горячую папку, которая будет редактировать любые новые файлы, добавленные в нее, пока вы не остановите запуск скрипта:
:start
:: return the raw (/b) list of files and full path to source text
FORFILES /p %~dp0source\ /s /m "*.cr2" /C "cmd /c echo @path" > source.txt
IF %ERRORLEVEL% EQU 1 goto :start
::join new and old data, return only what is shared in common (/g)
findstr /I /L /G:"source.txt" "output.txt" > found.txt
IF %ERRORLEVEL% EQU 1 copy /y source.txt notFound.txt
::join found file names and source filenames, return those that do not have a match
findstr /I /L /V /G:"found.txt" "source.txt" >> notFound.txt
IF %ERRORLEVEL% EQU 2 echo error no match
::for each line of notFound.txt, dequote and break apart
for /f %%n in (notFound.txt) do (
echo n=%%n
call :dequote %%n
)
:dequote
set fullPath=%~f1
set fileName=%~n1
set fileExt=%~x1
set filePath=%~dp1
set name=%fileName%& set npath=%filePath%& set ext=%fileExt%& set fpath=%fullPath%
echo %fpath%
echo %npath%
echo %name%
echo %ext%
cd %nPath%
if NOT [%1]==[] (
echo converted %name%
convert -negate -density 600 -colorspace gray flatField.cr2 %name%%ext% -compose Divide -composite %name%.tif
move %name%.tif %~dp0output
cd %~dp0
del notFound.txt
copy /y source.txt output.txt
) ELSE (
echo end of batch else
cd %~dp0
)
mycommand
вfor /F ('mycommand')
всегда отбрасывается. Это не относится кfindstr
. - person Harry Johnston   schedule 31.08.2015