Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


POSTREALITY, Виноват, не увидел Ваш пост.
при перемещении добавить значение из переменной %PREFIX%, которое пользователь изначально вводит при запуске скрипта
Я ориентировался на постановку задачи, когда имеется полное соответствие цифрового кода файла и имени папки
Код: Выделить весь код
@Echo Off
Cls
	Set "FileIn=Z:\Box_In\*_*.txt"
	Set "Delim=_"

	Set "@@Out1=Z:\Box_Out\01010101"
	Set "@@Out2=Z:\Box_Out\02020202"
	Set "@@Out3=Z:\Box_Out\03030303"

	Set /P Prefix="Укажите добавляемый префикс: "

	For %%i In ("%FileIn%") Do Call :Name "@@Out" "%Delim%" "%%i" "%Prefix%"

	Set /A N=0
	For %%i In ("%FileIn%") Do Set /A N+=1
	Echo !!! Осталось неперемещенными %N% файлов "%FileIn%"
pause
GoTo :Eof

:Name
	Set "S=%~n3"
	:Begin
		Set "SS=%S%
		Call Set "S=%%SS:*%~2=%%"
	If Not "%SS%"=="%S%" GoTo :Begin
	FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "%~1"`) DO (
		If "%%~nj"=="%S%" >nul Move /Y %3 "%%j\%~4_%~nx3" &&Exit /B 0
	)
Exit /B 1
Попробую объяснить. Для понимания измените For
Код: Выделить весь код
	For %%i In ("%FileIn%") Do Echo Call :Name "@@Out" "%Delim%" "%%i" "%Prefix%"
Естественно, после этого скрипт перемещать ничего не будет , но рассмотрим, что получилось на консоли:
Для каждого из файлов по маске "%FileIn%" вызывается процедура :Name
1 аргумент - префикс переменных для Out-путей
2 - разделитель перед цифровым кодом в конце имени файла
3 - полное имя файла из For
4 - вводимый префикс
В принципе, 1,2,4 аргументы можно было бы и не делать, а в процедуре их нарисовать явным образом, но я считаю, что такая работа с процедурой более гибкая: не надо менять текст процедуры при изменении данных, нужно только изменить параметры при вызове процедуры. Аргументы при вызове взял в кавычки, чтобы было возможным иметь в них пробелы.
Попробуйте вставить после :Name (естественно, без Echo перед Call
Код: Выделить весь код
:Name
Echo %1  %2  %3  %4
Вы увидите значения передаваемых аргументов в процедуру при каждом вызове.

Далее, проделайте For /? - полУчите help по For. Еще лучше, сделайте For /? >C:\_For.txt, и читайте в текстовом редакторе этот help.
В самом его конце пояснения конструкций типа %~nI (аналогично и %~n1)
То есть, Set "S=%~n3" позволяет из полного имени файла, переданного в 3 аргументе, выделить его имя в переменную S.
Почему я стараюсь брать равенство после Set в кавычки: чтобы при присваивании к значению не "прицепились" случайные пробелы при создании в текстовом редакторе кода: я не умею работать безошибочно.

Call Set "S=%%SS:*%~2=%%"
Для понимания проделайте Set /? >C:\_set.txt. Почитайте.
Здесь организован неявный цикл: допустим %SS% изначально соответствует тра_ля_ля_суффикс
При первом вызове %тра_ля_ля_суффикс:_*=% получим ля_ля_суффикс, то есть всё, что встретилось до первого вхождения _ "съелось"
Эту операцию проделали несколько раз, чтобы остался только суффикс в конце имени.
Форма вызова Call Set "S=%%SS:*%~2=%%" использована потому, что среди параметров замены использовали переменную %~2

Что Вам нужно:
- чтобы последние 20 знаков в имени файла ТОЧНО соответствовало имени папки?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 14-02-2019 в 15:46.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:03, 14-02-2019 | #16