копирование папки, переименование и увеличение значения - PullRequest
0 голосов
/ 18 июня 2019

В основном у меня есть папка с именем "9999-0004 - Шаблон создания проекта PM Access V2" Я хочу скопировать его и переименовать в «2019 - #### - название проекта» где #### - число с начальными нулями, а имя проекта - имя пользователя. Мой код работает нормально, увеличивая значение ####, но я говорю:

2019-0015 - project number 1
2019-0016 - some other project
2019-0018 - a different value
2019-0019 - insert name here

когда я запускал командный файл, я получал: 2019-0017 - переименовать эту папку

я хочу переименовать его в: 2019-0020 - переименовать эту папку

@echo off

setlocal enableDelayedExpansion


set source="C:\test1\9999-0004 - PM Access Project Creation Template V2"
set destination=C:\test2\

set /P project=please enter name of project:
set "n=0"

set "name=%project%"
set "year=2019"



pushd %destination%



:loop

set Var=0000%n%
set Var=%Var:~-4%

if exist %destination%\2019-%Var%* set /a n+=1 && goto :loop

set final_destination="%destination%2019-%Var% - %name%"
xcopy /s %source% %final_destination%\  /O /X /E /H /K

icacls %final_destination% /grant "MACStaff:(OI)(CI)(W)" 


popd

@echo on

1 Ответ

1 голос
/ 18 июня 2019
@echo off

setlocal

set "source=u:\sourcedir\t w o"
set "destination=u:\destdir"

SET "project=rename this folder"

set "year=2019"

SET /a var=10000

FOR /f "tokens=2delims=- " %%a IN ('dir /ad /on /b "%destination%\%year%-*" 2^>nul') DO set /a Var=1%%a + 1
set "final_destination=%destination%\%year%-%Var:~1% - %project%"
echo xcopy /s "%source%" "%final_destination%\"  /O /X /E /H /K

ECHO icacls "%final_destination%" /grant "MACStaff:(OI)(CI)(W)" 

GOTO :EOF

Я использовал имена каталогов, которые подходят для моей системы.

Я также принудительно ввел новый суффикс ввода каталогов для целей тестирования

Синтаксис SET "var=value" (где значение может быть пустым) используется для гарантии того, что любые заданные пробелы НЕ включаются в назначенное значение.

Присвоение строк в кавычках переменным затрудняет их логическое объединение.Вставка кавычек по мере необходимости гораздо проще.

Обратите внимание, что для этой процедуры не требуется delayedexpansion (что, по-видимому, вы не использовали в любом случае)

Итак, принцип заключается в чтении каталогаперечисление в /b базовом режиме /ad только имен каталогов /on в порядке имен с использованием маски %year%-*, то есть всех имен каталогов за рассматриваемый год.

Использование разделителей - и Пробел , в результате %%a получает каждый серийный номер по очереди (Ваш формат: гггг - серийный Пробел текст, так что второй токенсодержит серийный номер), поэтому var отображается с последним найденным значением, с добавлением 1 и добавлением 1.

Если нет подходящих имен каталогов, то 2^>nul подавляет уродливое сообщение об ошибке (то есть отправляет сообщения об ошибках на устройство nul, чтобы избавиться от них, а символ вставки (^) сообщает * 1035)* что перенаправитель является частью команды dir, которую нужно выполнить, а не for. var останется неизменным, поэтому он сохранит значение 10000.

Тогда создайте final_destination По-меккански и приготовь себе чашку кофе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...