Для цикла в пакетном файле, чтение файла пути к файлам - PullRequest
2 голосов
/ 21 января 2012

Я хочу написать сценарий пакетного файла Windows, который будет циклически проходить через текстовый файл FILE PATHS, выполнять некоторую работу, используя данные из каждого пути к файлу, а затем в конечном итоге удалять файл.

Я начал с запускаКоманда FORFILES и отправка ее выходных данных ( параметр @ PATH - это полный путь любого файла, которому он соответствует ) в текстовый файл (results.txt).

Я получаю файл results.txt, подобный следующему:

"C:/Windows/Dir1/fileA.log"
"C:/Windows/Dir1/fileA.log"
"C:/Windows/Dir2/fileC.log" 
"C:/Windows/Dir3/fileB.log"

Я хочу сделать следующее:

  • Использовать цикл FOR и читать каждую строкув файле results.txt
  • Для каждой строки (путь к файлу) выделите имя каталога, в котором находится файл журнала (т. е. Dir1, Dir2 и т. д.), и создайте каталог с этим ЖЕимя в другом месте (т. е. D: / Archive / Backups / Dir1, D: / Archive / Backups / Dir2 и т. д.) - при условии, что каталог не существует.
  • Перемещение фактического.файл журнала в zip-файл в этом каталоге [У меня есть код для этого].
  • Удалите файл .log из исходного файлакатион.[Довольно просто]

У меня проблемы с поиском наилучшего способа выполнить первые два шага.Кажется, мой цикл FOR останавливается после прочтения самой первой строки:

FOR /F "tokens=1,2,3,4,5,6,7,8,9,10 delims=\" %%G in ("results.txt") DO (
...
)

Ответы [ 3 ]

2 голосов
/ 21 января 2012

Вы не хотите анализировать путь с помощью параметров токенов / разделителей, потому что вы не знаете, с какими уровнями каталогов вы имеете дело.Вы хотите сохранить каждую строку целиком.Для разбора пути вы хотите использовать модификаторы переменных FOR.(введите HELP FOR в командной строке и посмотрите на последний раздел вывода)

%% ~ pG дает путь (без диска или имени файла).Если затем мы удалим последнюю \, мы сможем пройти еще одну итерацию FOR и получить имя (и возможное расширение) каталога файла, используя %% ~ nxA.

Переключение отложенного расширения просто для защиты от возможного ! на пути.Если вы знаете, что ни один путь не содержит !, тогда вы можете просто включить отложенное расширение в верхней части скрипта и покончить с ним.

EDIT - этот код был значительно изменен, так как Aacini указал, что я неправильно прочиталтребования.Теперь он должен удовлетворять требованиям.

for /f "usebackq delims=" %%G in ("results.txt") do (
  set "myPath=%~pG"
  setlocal enableDelayedExpansion
  for /f "eol=: delims=" %%A in ("!myPath:~0,-1!") do (
    endlocal
    if not exist d:\Archive\Backups\%%~nxA md d:\Archive\Backups\%%~nxA
    rem ::zip %%G into zip file in the D: location
    rem ::you should be able to create the zip with the move option
    rem ::so you don't have to del the file
  )
)
1 голос
/ 16 апреля 2016

Я записал это в файлы временных меток перед выгрузкой в ​​SFTP.

Надеюсь, вы найдете это полезным.

Кодирование временной метки может показаться несоответствующим вашей проблеме, но я оставил ее, потому что это хороший пример анализа самого имени файла.

Я предлагаю вам поставить ECHO перед командой REN для тестирования. Разные оболочки могут иметь разные результаты.

В конце концов, команда delayedexpansion не была необходима. Это была подпрограмма, которая исправила мои проблемы с переменными внутри цикла. Это может быть из-за моей версии ОС. (Win 8.1) - Не мешало бы его оставить.

@echo off
cls
setlocal enabledelayedexpansion
if %time:~0,2% geq 10 set TIMESTAMP=%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%
if %time:~0,2% leq 9  set TIMESTAMP=%date:~10,4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2%

echo TimeStamp=%TIMESTAMP%
echo.

for %%G in (*.txt) do (
set OLDNAME=%%G
call :MXYZPTLK
)

dir *.txt

goto :EOF

:MXYZPTLK
echo OldName=%OLDNAME%
ren %OLDNAME% %OLDNAME:~0,-4%_%TIMESTAMP%%OLDNAME:~-4,4%
echo.

:END
0 голосов
/ 21 января 2012

У вас есть две незначительные проблемы:

  • Разделителем пути в файле является '/', но вы используете '\' в цикле for.
  • Кавычки вокруг "results.txt" перестают работать.

Это работает. Не пишите кавычки в results.txt, и вы не получите кавычки в конце имени файла.

@echo off
FOR /F "tokens=3,4 delims=/" %%I in (results.txt) DO (
  REM Directory
  echo %%I
  REM File
  echo %%J
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...