Создание командного файла для сортировки журналов по соответствующим папкам месяца и года ...?

Есть несколько неопределенных или похожих вопросов по этому поводу, которые я попытался собрать воедино в меру своих возможностей, но не уверен, правильно ли я сделал это или нет.

Цель командного файла - найти дату в именах файлов, создать папку, в которой месяц и год даты этого имени файла указаны с префиксом «01», и переместить ее туда. Расположение созданной папки будет на один уровень выше того места, где будут находиться текущие файлы журнала. Если имя папки уже существует с префиксом «01», но имеет другой месяц и год, он будет создан с префиксом « 02 ", и если он уже существует, он продолжит создание папки с префиксом" 03 ", и это будет продолжаться до тех пор, пока он не найдет больше папок с префиксом, который он пытается создать, который уже занят, и перейдет к создайте папку месяца и года с этим неиспользуемым префиксом.

Теперь код, это то, что у меня есть прямо сейчас:

SETLOCAL ENABLEDELAYEDEXPANSION
for %%a in (*.log) do (
    if exist *-10-2017*.log (
        if exist 01* && not *01*.log (
            set "iter="
            set /p iter=01
            set /a iter+=1 
            set f1=!%inter%" October"!
            md "..\!f1!"
            move "%%a" "!f1!"
        ) else (
        md "01 October 2017" 2>nul
        move "%%a" "01 October 2017"
        )
    ) 
)

Это только на октябрь 2017 года, так что вам следует проверить дату имени файла журнала, если в нем есть «-10-2017» где-либо в имени файла, создайте папку «01 октября 2017» в каталоге над текущим и переместитесь туда, предполагая не существует другой папки с именем 01 мая 2017 года, например, или любой другой папки, начинающейся с имени 01 (кроме уже созданной целевой папки, в этом случае пакет просто переместит файл без необходимости создавать отдельную папку того же месяца и год, но с другим префиксом, который не нужен, поэтому мне не нужны папки "01 октября 2017" и "02 октября 2017", если, например, уже существует 01 октября 2017 г.), это должно быть круто, и если есть , он будет повторяться до тех пор, пока не найдет неиспользуемый номер, каждый раз переходя +01, а затем продолжит использовать его в качестве префикса.

Но это не работает, потому что я остановился на:

E:\SteamCMD\KFServer\UserLogs\11\unread\test>SETLOCALENABLEDELAYEDEXPANSION
&& was unexpected at this time.

Я уже нашел рабочую деталь, из которой я модифицировал это:

SETLOCAL ENABLEDELAYEDEXPANSION
for %%a in (*.log) do (
    set f=%%a
    set g=!f:~92,10!
    md "!g!" 2>nul
    move "%%a" "!g!"
    )
)

Но он просто перемещает их в их папки с датами уважения, где я хочу, чтобы они были в соглашении об именах месяца и года, а также на один уровень выше, а также добавили префикс 01 к именам папок для легкой сортировки и поиска позже .... .Также другая проблема заключается в том, что если появляется другой журнал того же месяца и года, но другой день (например, 15-10-2017.log и 10-10-2017.log), он будет в их собственной папке, создавая больше беспорядка, когда я могу просто группировать журналы по месяц год, а не отдельные дни ....

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

С уважением, Новый (oo) b Coder

Ваш синтаксис if неверен (см. if ?). Нет ни &&, ни AND, ни чего-то подобного. Также обратите внимание: числа, начинающиеся с 0, обрабатываются как восьмеричные, а 08 не является допустимым восьмеричным числом (кроме того, увеличение с начальными нулями не работает так)

Stephan 10.09.2018 09:41

Посмотрим, поможет ли это

Stephan 10.09.2018 09:45

@ Стефан, спасибо за это; как насчет проверки и реализации префиксов для именования папок? Обновлено: Тогда как вы объединяете утверждения, если вы не можете использовать && или AND ...? Как мне тогда увеличивать с начальными нулями?

Newb Coder 10.09.2018 11:31

@Stephan, также этот скрипт занял 1 минуту и ​​40 секунд, чтобы просто отсортировать 11 тестовых файлов после редактирования кода, чтобы отразить изменения, необходимые для работы моих файлов журнала вместо файлов Excel, и добавить бит для повышения уровня и создайте папку (и) там, а не на том же уровне каталога ... а также пробел между словами месяца и года .... если я получу это, я буду смотреть, чтобы позволить ему пройти через 10k файлов журнала ....... что означает минимум 11,57407407407407 дней, чтобы компьютер мог работать ...

Newb Coder 10.09.2018 11:42

@Stephan, на самом деле осталось более 100k файлов журнала, моя ошибка, и поскольку я больше не могу редактировать предыдущий комментарий, так как это было более 5 минут .... так что это 115.7407407407407 дней .... Я уже пытался вручную просмотреть около 30k из них до того, как даже попытаться решить автоматизировать его с помощью пакетного сценария, осталось только более 100 тысяч для сортировки вручную или автоматически с пакетным сценарием ... и, черт возьми, это была рутинная работа! Хахахахахаха

Newb Coder 10.09.2018 11:49

@ Стефан, я умный .... это минимум 10,52188552188552 дней с более чем 100k файлов, а не 115, забыл разделить на 11 ... автоматизировано менее чем за час, желательно за несколько минут или меньше ........ 😛

Newb Coder 10.09.2018 12:42
if exist a.txt if exist b.txt echo both exist
Stephan 10.09.2018 14:32

Извините, я до сих пор не могу понять, что это за префикс 01. Разве имя в формате YYYY-MM не было бы идеальным для облегчения сортировки результирующих папок?

Stephan 10.09.2018 17:20

@Stephan, нет, потому что тогда апрель будет в верхней части списка при сортировке по имени (поскольку это сортировка по умолчанию в проводнике файлов), и он будет 2017 April, 2017 August, etc.,, когда я хочу, чтобы он начинался с January 2017, February 2017, но он перечисляется в алфавитном порядке а не в порядке календарного месяца и года, мне нужно было бы иметь ведущий ноль и цифру рядом для обозначения порядка. Итак, 01 January 2017, 02 February 2017, 03 March 2017, etc., Ой, я неправильно прочитал, так получилось, что я начал со схемы именования MMMM YYYY и придерживался этого с тех пор, как начал вручную сортировать на глаз и вручную

Newb Coder 11.09.2018 01:39

Забыл добавить, что я вырос с соглашением D(D)-MM(MM)-YY(YY) ... поэтому день всегда первый (с нулем в начале или без него), за которым следует тире или пробел, если я не могу (или не хочу) используйте тире, затем месяц в любой форме, затем еще один тире или пробел, если я не могу (или не хочу) использовать тире, тогда год будет двумя последними цифрами или цифрами полного года. Мне не очень нравятся другие форматы, такие как MM-DD-YY или YY-MM-DD в обратном порядке, мне он просто кажется странным, и я больше привык к моему предпочтительному формату, если это вообще возможно, а это так ...

Newb Coder 11.09.2018 02:14

... и у меня закончилось место для персонажей, так что придется создать новый пост; точно так же, как некоторые люди предпочитают это конкретный способ делать что-то, я предпочитаю это для моего формата даты, и поскольку формат даты в любом случае такой в ​​Австралии, так что я могу также следовать и придерживаться соглашения ... .. так вот и история ....

Newb Coder 11.09.2018 02:16
0
11
285
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set m=0
for %%a in (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) do (
  set /a m+=1
  set "m[!m!]=%%a"
)

for /l %%Y in (2010,1,2020) do (
  for /l %%M in (1,1,12) do (
    set /a mm=%%M+100
    set "mm=!mm:~-2!"
    if exist "*!mm!-%%Y*.log" (
      ECHO md "!mm! !m[%%M]! %%Y" 2>nul
      ECHO move "*!mm!-%%Y*.log" "!mm! !m[%%M]! %%Y\"
    )
  )
)

Я отключил команды md и move из соображений безопасности.

Какие есть соображения безопасности, чтобы отключить команды md и move ?! хахахаха .... В любом случае, извиняюсь за поздний ответ, мой компьютер решил подобрать подходящий вариант, ммм, это близко - с нумерацией, изначально хотел, чтобы он начинался с 01, даже если Яна не существовало, поэтому, например, я только имел журнал в декабре 2017 года, но не имел других журналов в другие месяцы, он создавал папку с именем 01 декабря 2017 года и перемещал туда файлы; но я полагаю, это сойдет. Я также смотрел на цикл for и на то, как он работает сам, но я думаю, вы уже опередили меня в этом, прежде чем я смог ответить с какими-либо результатами.

Newb Coder 24.09.2018 07:39

Конечно, хотелось бы сделать мини-абзацы в комментариях, чтобы они были удобоваримыми; так далеко от вашего кода, он пропускает перемещение на один уровень вверх и создание папок там и перемещение файлов туда, и я думаю, что это все, скорость почти мгновенная и чистый cmd, а не смесь cmd + powershell - да, это сделаю, отлично спасибо! Просто собираюсь увеличить дату окончания года с 2020 до более высокой ....

Newb Coder 24.09.2018 08:06

Правильно ли я редактировал это? @echo off SETLOCAL ENABLEDELAYEDEXPANSION set m=0 for %%a in (January February March April May June July August September October November December) do ( set /a m+=1 set "m[!m!]=%%a" ) for /l %%Y in (2010,1,2050) do ( for /l %%M in (1,1,12) do ( set /a mm=%%M+100 set "mm=!mm:~-2!" if exist "*!mm!-%%Y*.log" ( md "..\!mm! !m[%%M]! %%Y" 2>nul move "..\*!mm!-%%Y*.log" "!mm! !m[%%M]! %%Y\" ) ) )

Newb Coder 24.09.2018 08:09

На самом деле знаете что? К черту форматирование комментариев, вот ссылка pastebin: pastebin.com/yMHzbE6X Намного красивее! ☺ Черт, 5 минут летят довольно быстро .... Поэтому, когда я запускаю этот модифицированный код, я получаю "A duplicate file name exists, or the file cannot be found."

Newb Coder 24.09.2018 08:15

«причина безопасности» - это предотвратить повреждение / переименование ваших данных до того, как у вас будет выбор проверить, делает ли они то, что вы хотите. Представьте, что команда ren не совсем то, что вам нужно - вы можете остаться с множеством ложно переименованных файлов (возможно, даже непоследовательно, так что вам придется много работать, чтобы отменить ее)

Stephan 24.09.2018 08:38

Вы обрабатываете файлы в папке Текущий, if проверяет наличие в папке Текущий и затем вы пытаетесь переместить из папки родитель..`. Therefore файл не может быть найден ».

Stephan 24.09.2018 08:41

А, ну не беспокойтесь об этом - я использую только тестовые файлы журнала (по сути, копии их подлинного аналога, но для этого пакетного тестирования, прежде чем я сделаю это в целом, как задумано ...), поэтому не было бы нанести вред, даже если эти файлы были удалены или перемещены куда-то, где они не должны были быть. ☺

Newb Coder 24.09.2018 11:46

да, работать над копиями (или иметь резервную копию) во время разработки - это лучший способ. Но хотите верьте, хотите нет - вы здесь крайнее исключение ...

Stephan 24.09.2018 11:55

Ах, я вижу, это правильная строка: move "*!mm!-%%Y*.log" "..\!mm! !m[%%M]! %%Y\", а не move "..\*!mm!-%%Y*.log" "!mm! !m[%%M]! %%Y\"

Newb Coder 24.09.2018 14:06

Другие вопросы по теме