2016-12-11 8 views
0

Я пытаюсь переименовать большое количество папок с датами в качестве имен. Я создал тестовую папку, содержащую только две такие папки. Их именаВыбирайте имена папок и переименовывайте папки с помощью пакетной команды

1-23-2014
10-1-2016

Я хочу, чтобы переименовать их

2014-01-23
2016-10-01

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

C:\Users\Harry\Documents\Test Batch Job>dir 
Volume in drive C is Windows 
Volume Serial Number is 30C3-D653 

Directory of C:\Users\Harry\Documents\Test Batch Job 

12/11/2016 01:52 PM <DIR>   . 
12/11/2016 01:52 PM <DIR>   .. 
11/27/2016 10:33 PM <DIR>   1-23-2014 
11/27/2016 10:33 PM <DIR>   10-1-2016 
       0 File(s)    0 bytes 
       4 Dir(s) 309,874,257,920 bytes free 

C:\Users\Harry\Documents\Test Batch Job>for /f "tokens=1,2,3 delims=-" %%A in ("%~dp0") do rename %%A-%%B-%%C %%C-%%A-%%B 
%%A was unexpected at this time. 

C:\Users\Harry\Documents\Test Batch Job> 

Я знаю, что я не иметь дело с отсутствующими ведущими нулями с этой командой - Я разберусь с этим после того, как я получаю эту команду работать.

Я получаю сообщение об ошибке

%% А был неожиданным в это время.

Как я могу пройти мимо этой ошибки? Благодарю.

+2

Ничего себе, как правило, когда кто-то имеет эту проблему, это наоборот. Когда вы запускаете цикл for в командной строке, вы используете '% A' вместо' %% A'. – SomethingDark

+1

Очень странная попытка использовать '% ~ dp0' из командной строки. Это имеет смысл только из пакетного скрипта, где ваш '%% A' будет работать нормально. – dbenham

+0

Возможно, вы захотите проверить мою [регулярную экспансию batch/JScript renaming utility JREN.BAT] (http://www.dostips.com/forum/viewtopic.php?t=6081). Таким образом, полное решение из пакетного сценария будет «call jren»^(\ d \ d?) - (\ d \ d?) - (\ d {4}) $ "" $ 3 + '-' + lpad ($ 1, '00 ') +' - '+ lpad ($ 2, '00') "/ d/j', и он оставляет только каталоги, которые не соответствуют вашему шаблону даты. – dbenham

ответ

2

Если выход партии выглядит правильно, удалите echo в последней строке.

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion 
Set Base=C:\Users\Harry\Documents\Test Batch Job 
pushd %Base% 
For /f "tokens=1-3 delims=-" %%A in (
    'Dir /B/AD *-*-* ^|findstr "^[0-9][0-9]*-[0-9][0-9]*-[0-2][0-9][0-9][0-9]$"' 
) Do call :Sub %%A %%B %%C 
popd 
goto :Eof 
:Sub month day year 
If %1 gtr 12 Goto :Eof 
Set /A "yy=%3,mm=%1+100, dd=%2+100" 
Echo Rename "%1-%2-%3" "%yy%-%mm:~-2%-%dd:~-2%" 
  • Для/ф разбирает линии передается от Dir и фильтруют с помощью регулярных выражений Findstr
  • tokens=1-3 Delims=- означает линия разделена на 3 части расщепления при - назначая для %% A Варс - %% C
  • в подразделах они принимаются в качестве аргументов% 1 -% 3
  • Set /A добавляет 100 в месяц и день
  • %mm:~-2% занимает только два последних места, давая ведущий ноль, если меньше, чем 10

Aschipls комментарии правы, выше изменена версия должна работать

+0

Вы забыли закрытие '' 'в командной строке' findstr'. Ваша строка поиска 'findstr' (reg expr.) Неверна, нет специального символа' + ', который поддерживается, поэтому' [0-9] + ' part does * not * означает «один или несколько десятичных цифр», это просто означает «одна десятичная цифра, за которой следует знак плюса», вы можете заменить ее на «[0-9] [0-9] *», что означает «одна десятичная цифра, за которой следуют ноль или более десятичных цифр», что, в свою очередь, означает то, что вы намеревались достичь с помощью [[0-9] + '... – aschipfl

+0

В качестве альтернативы вы можете предоставить несколько строк поиска, используя параметр '/ C', один из которых должен быть сопоставлен, например:' findstr/C: "^ [0-9] - [0-9] - [0-2] [0-9] [0-9] [0-9] $ "/ C:"^[0-9] [0-9] - [0-9] - [0-2] [0-9] [ 0-9] [0-9] $ "/ C:"^[0-9] - [0-9] [0-9] - [0-2] [0-9] [0-9] [0 -9] $ "/ C:"^[0-9] [0-9] - [0-9] [0-9] - [0-2] [0-9] [0-9] [0- 9] $ "' – aschipfl

+0

@aschipfl Вы правы. Но '[0-9] [0-9] *' проще. Я знаю, что, но переключение языков скриптов и версий Regex в последний раз заставил меня ошибиться. Спасибо за подсказку. – LotPings

 Смежные вопросы

  • Нет связанных вопросов^_^