![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Переименование каталогов |
|
CMD/BAT - [решено] Переименование каталогов
|
Новый участник Сообщения: 17 |
Добрый день!
Помогите, пожалуйста, реализовать следующее: В каталоге есть 10 подкаталогов типа: 100_0447, 100_0448 и пр. Нужно переименовать их, дописав в конец строки из текстового файла. В нём, к примеру, такое (1000) (750) (600) (500) (400) (300) (200) (100) (50) (25) Подкаталоги должны переименоваться так: 100_0447 (1000), 100_0448 (750) и т.д. Пробовал так: echo off setlocal ENABLEEXTENSIONS setlocal ENABLEDELAYEDEXPANSION dir /B /A:D >dir.txt For %%a In (1000 750 600 500 400 300 200 100 50 25) Do (Set /a cnt +=1& Set Arr[!cnt!]=%%a ) for /f "usebackq delims=" %%i in ("dir.txt") do (Set /a index +=1 echo i= %%i echo index= !index! echo !Arr[%%index]! echo !Arr[1]! !Arr[2]! !Arr[3]! !Arr[4]! !Arr[5]! !Arr[5]! !Arr[7]! !Arr[8]! !Arr[9]! !Arr[10]! ) pause Но почему-то, в цикле не выводятся элементы массива, хотя они определены: Скрытый текст
b:\test>echo off
i= 100_0447 index= 1 Режим вывода команд на экран (ECHO) отключен. 1000 750 600 500 400 400 200 100 50 25 i= 100_0448 index= 2 Режим вывода команд на экран (ECHO) отключен. 1000 750 600 500 400 400 200 100 50 25 i= 100_0449 index= 3 Режим вывода команд на экран (ECHO) отключен. 1000 750 600 500 400 400 200 100 50 25 i= 100_0450 index= 4 Режим вывода команд на экран (ECHO) отключен. 1000 750 600 500 400 400 200 100 50 25 i= 100_0451 index= 5 Режим вывода команд на экран (ECHO) отключен. 1000 750 600 500 400 400 200 100 50 25 i= 100_0452 index= 6 Режим вывода команд на экран (ECHO) отключен. 1000 750 600 500 400 400 200 100 50 25 i= 100_0453 index= 7 Режим вывода команд на экран (ECHO) отключен. 1000 750 600 500 400 400 200 100 50 25 i= 100_0454 index= 8 Режим вывода команд на экран (ECHO) отключен. 1000 750 600 500 400 400 200 100 50 25 i= 100_0455 index= 9 Режим вывода команд на экран (ECHO) отключен. 1000 750 600 500 400 400 200 100 50 25 i= 100_0456 index= 10 Режим вывода команд на экран (ECHO) отключен. 1000 750 600 500 400 400 200 100 50 25 Для продолжения нажмите любую клавишу . . . |
|
Отправлено: 15:11, 20-08-2018 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать В пакетных файлах отсутствует такое понятие, как «массив».
@echo off setlocal enableextensions enabledelayedexpansion set sSourceFolder=C:\Мои проекты\0186 set sNamesFileList=C:\Мои проекты\0186\Names.txt if exist "%sSourceFolder%\." ( if exist "%sNamesFileList%" ( set /a iCount = 0 for /f "usebackq delims=" %%i in ("%sNamesFileList%") do ( set sNameFileList!iCount!=%%~i set /a iCount += 1 ) set /a iCount = 0 for /f "usebackq delims=" %%i in ( `2^>nul dir /b /a:d "%sSourceFolder%\*.*"` ) do ( if defined sNameFileList!iCount! call ren "%sSourceFolder%\%%~i" "%%~i %%sNameFileList!iCount!%%" set /a iCount += 1 ) ) else ( echo Can't find name's file list file [%sNamesFileList%]. exit /b 2 ) ) else ( echo Can't find source folder [%sSourceFolder%]. exit /b 1 ) endlocal exit /b 0 |
Отправлено: 16:24, 20-08-2018 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 17
|
Профиль | Отправить PM | Цитировать Отсутствует, так отсутствует. Спасибо, всё получилось.
|
Отправлено: 16:39, 20-08-2018 | #3 |
Ветеран Сообщения: 2735
|
Профиль | Отправить PM | Цитировать Цитата Iska:
@Echo Off Set "Txt=1000 750 600 "500" 400 300 200 100 50 25" Set "BoxIn=Z:\Soft_In" Set "Mask=100_*.*" Set /A i=0 FOR %%f IN (%Txt%) Do Call :MassIn "A" "i" %%f Set /A j=0 FOR /D %%f IN ("%BoxIn%\%Mask%") DO Call :MassIn "B" "j" "%%f" If %i% GTR %j% Set /A i=%j% If Not %i% EQU 0 FOR /L %%f IN (1,1,%i%) DO Call :MassRen "%%A%%f%%" "%%B%%f%%" GoTo :Eof :MassIn Set /A %~2+=1 Call Set /A @i=%~2 Set "%~1%@i%=%~3" GoTo :Eof :MassRen Ren %2 "%~nx2 (%~1)" GoTo :Eof |
|
------- Отправлено: 19:04, 20-08-2018 | #4 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
|
||
Отправлено: 19:31, 20-08-2018 | #5 |
Новый участник Сообщения: 17
|
Профиль | Отправить PM | Цитировать Но мне всё равно непонятно, почему значения echo !Arr[1]! !Arr[2]! !Arr[3]! !Arr[4]! !Arr[5]! !Arr[5]! !Arr[7]! !Arr[8]! !Arr[9]! !Arr[10]! выводятся, а echo !Arr[%%index]! - нет.
Может я неправильно передаю индекс? С этими процентами, восклицательными знаками и пр. - постоянная путаница. ![]() |
Отправлено: 02:08, 21-08-2018 | #6 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата shraybikus:
1. — технически допустимо, но логически неверно. Таким образом Вы задаёте сначала один локальный контекст, затем, тут же, ещё один. В этом нет смысла. Правильным будет использование одной команды setlocal: 2. В условии у Вас: Цитата shraybikus:
Для читабельности лучше не стесняться использовать фолдинг, наподобие: 3. Цитата shraybikus:
echo %Arr[1]% %Arr[2]% %Arr[3]% %Arr[4]% %Arr[5]% %Arr[5]% %Arr[7]% %Arr[8]% %Arr[9]% %Arr[10]% Цитата shraybikus:
Первую можно получить по !index! [или call %%index%%] (вот здесь отложенное раскрытие [или двойное обычное раскрытие] уже нужно, потому что её значение ранее задаётся внутри тех же операторных скобок). Вторая доступна по %%i. А что у нас? А у нас так: Вы думаете, что %%index — переменная окружения index? Это не так. В этом коде нет переменной окружения index. Зато есть переменная цикла разбора %%i. Которая раскроется в своё значение из содержимого файла dir.txt — сначала в 100_0447, затем в 100_0448 и т.д. Таким образом, интерпретатор команд при попытке отложенного раскрытия сначала увидит переменную окружения Arr[100_0447ndex], которая, разумеется, не существует, затем переменную окружения Arr[100_0448ndex], которая тоже не существует, и т.д. Как это можно обойти? Например, так, как в моём коде выше: if defined sNameFileList!iCount! call ren "%sSourceFolder%\%%~i" "%%~i %%sNameFileList!iCount!%%" |
||||
Отправлено: 08:09, 21-08-2018 | #7 |
Crazy Сообщения: 1235
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Но всё равно, это ведь имеет право на жизнь, особенно если случай с ОС "запущенный" и использование чего-то внешнего проблематично... вот, откопал таки ссылку |
|
------- Отправлено: 13:35, 21-08-2018 | #8 |
Новый участник Сообщения: 17
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
![]() |
|
Отправлено: 13:58, 21-08-2018 | #9 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
Ну, и в скобках отмечу, что: Цитата:
![]() |
||
Отправлено: 14:30, 21-08-2018 | #10 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Синхронизация каталогов | Makzs | Скриптовые языки администрирования Windows | 4 | 03-11-2009 15:56 | |
синхронизация каталогов | Saduga | Microsoft Windows NT/2000/2003 | 4 | 20-08-2008 16:07 | |
дерево каталогов | slaine | Вебмастеру | 8 | 26-02-2006 20:45 | |
Разорхивация каталогов | Neto | Хочу все знать | 4 | 04-12-2003 22:38 | |
Обновление каталогов в проводнике | soloIL | Microsoft Windows 95/98/Me (архив) | 1 | 16-05-2003 08:36 |
|