Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Скопировать часть имени файла в переменную

Ответить
Настройки темы
CMD/BAT - [решено] Скопировать часть имени файла в переменную

Новый участник


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

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


Изменения
Автор: crazydog
Дата: 17-06-2019
Добрый день уважаемые форумчане. Не могу решить задачку. Буду благодарен.
В папке лежат файлы типа CONS#111_000000.USR либо CONS#1_000000.USR
Необходимо 000000 закинуть в переменную.
Нашел способ
Код: Выделить весь код
setlocal ENABLEDELAYEDEXPANSION
cd RECEIVE
for %%i in (*.usr) do (
  set FILENAME=%%i
  set NUMBER=!FILENAME:~7,6!
  echo !NUMBER!
)
но данный вариант не "универсален", т.к. не учитывает количество символов в файле (9 или 7 символов в начале).
P.S. В итоге нужно с конца имени пропустить 4 символа (.USR) и использовать следующие 6 символов (000000)

Отправлено: 20:17, 17-06-2019

 
mwz mwz вне форума

Аватара для mwz

Ушел из жизни


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

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


Цитата crazydog:
set NUMBER=!FILENAME:~7,6! »
Если количество символов после подчёркивания во всех именах одинаково и они везде завершают имя — надо отсчитывать не от начала имени, а 6 символов от конца.

А для извращенцев — начинать отсчёт вперёд от символа подчёркивания.

-------
Mikhail Zhilin


Отправлено: 20:23, 17-06-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


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

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


Цитата mwz:
надо отсчитывать не от начала имени, а 6 символов от конца. »
Вот и вопрос как это реализовать на практике!

Отправлено: 20:25, 17-06-2019 | #3

mwz mwz вне форума

Аватара для mwz

Ушел из жизни


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

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


crazydog, я-то могу написать — но мне придётся долго вспоминать и смотреть документацию.

Коллеги же напишут этот код за 5 секунд с закрытыми глазами — так что подождите их ответ(ы).
И пока можете попробовать найти сами, как это делается: там что-то элементарное.

PS
Типа:
Код: Выделить весь код
set NUMBER=!FILENAME:~-6!
— но надо чтобы имя файла подставлялось без расширения.

-------
Mikhail Zhilin


Последний раз редактировалось mwz, 17-06-2019 в 20:56.


Отправлено: 20:32, 17-06-2019 | #4


Новый участник


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

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


да, работает, но нужно расширение убрать

Последний раз редактировалось crazydog, 17-06-2019 в 21:16.


Отправлено: 21:02, 17-06-2019 | #5

mwz mwz вне форума

Аватара для mwz

Ушел из жизни


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

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


crazydog

При условии, что расширение 3-символьное — берём 10 последних символов и отбрасываем 4 самых последних (.ext):
Код: Выделить весь код
set NUMBER=!FILENAME:~-10,-4!
Но коллеги напишут изящнее...

PS
...возможно использовав в цикле конструкцию
Код: Выделить весь код
delims=.
— тогда расширение отрежется независимо от его длины и наличия, и можно будет использовать мой первый вариант (т.е. просто ~-6)

-------
Mikhail Zhilin


Последний раз редактировалось mwz, 17-06-2019 в 21:22.

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

Отправлено: 21:09, 17-06-2019 | #6


Ветеран


Contributor


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

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


Код: Выделить весь код
@Echo Off
cls
	Set "BoxIn=Z:\Box_In"
	Set "Mask=CONS#*_??????.USR" 

	FOR /F "usebackq tokens=2 delims=_." %%n IN (`2^>nul Dir /B /A:-D "%BoxIn%\%Mask%"`) DO Echo %%n
Pause
Exit /B
Первый вариант предпочтительнее, остальные, ИМХО, хуже
Код: Выделить весь код
@Echo Off
cls
	SetLocal EnableExtensions EnableDelayedExpansion

	Set "BoxIn=Z:\Box_In"
	Set "Mask=CONS#*_??????.USR" 

	FOR /F "usebackq tokens=2 delims=_." %%n IN (`2^>nul Dir /B /A:-D "%BoxIn%\%Mask%"`) DO (
		Set "NN=%%n"
		Echo !NN!
	)

	EndLocal
Pause
Exit /B
Код: Выделить весь код
@Echo Off
cls
	SetLocal EnableExtensions EnableDelayedExpansion

	Set "BoxIn=Z:\Box_In"
	Set "Mask=CONS#*_??????.USR" 

	FOR /F "usebackq delims=" %%n IN (`2^>nul Dir /B /A:-D "%BoxIn%\%Mask%"`) DO (
		Set "NN=%%~nn"
		Set "NN=!NN:~-6!
		Echo !NN!
	)

	EndLocal
Pause
Exit /B
Код: Выделить весь код
@Echo Off
cls
	SetLocal EnableExtensions EnableDelayedExpansion

	Set "BoxIn=Z:\Box_In"
	Set "Mask=CONS#*_??????.USR" 

	FOR /F "usebackq delims=" %%n IN (`2^>nul Dir /B /A:-D "%BoxIn%\%Mask%"`) DO (
		Set "NN=%%~nn"
		Set "NN=!NN:*_=!
		Echo !NN!
	)

	EndLocal
Pause
Exit /B

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


Последний раз редактировалось megaloman, 17-06-2019 в 21:26.

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

Отправлено: 21:16, 17-06-2019 | #7


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Powershell:
Код: Выделить весь код
$f = (gci *.usr).basename |select -first 1
$l = $f.length
$num = $f.substring($l - 6)

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

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

Отправлено: 21:31, 17-06-2019 | #8


Ветеран


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

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


Цитата megaloman:
Первый вариант предпочтительнее, остальные, ИМХО, хуже»
Вариант со звёздочкой — надёжнее. Только в маске я не уверен (про жёсткое количество «?», впрочем, я уже не помню форматы построения имён Кщнсультант+).

Отправлено: 03:52, 18-06-2019 | #9


Ветеран


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

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


а я, вероятно, сделал бы нечто среднее от кодов megaloman, что-то типа:
Код: Выделить весь код
@echo off
set "d=C:\Papka"
set "m=CONS#*_*"

pushd "%d%"
 for /f "tokens=2 delims=_" %%a in ('dir /a-d/b "%m%"') do echo %%~na
popd

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

Отправлено: 08:41, 19-06-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Скопировать часть имени файла в переменную

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] поиск файла по маске и запись этого имени в переменную ___dima___ Скриптовые языки администрирования Windows 20 18-06-2017 01:46
CMD/BAT - Скопировать в папку, зная только часть ее Имени magarjoba Скриптовые языки администрирования Windows 9 15-02-2017 11:12
Любой язык - Скопировать часть блоков из одного текстового файла в другой Alexander_88 Скриптовые языки администрирования Windows 4 19-02-2016 14:59
CMD/BAT - [решено] Увеличение значения имени переменной или считывание строки файла в переменную VokaMut Скриптовые языки администрирования Windows 12 26-11-2012 15:54
CMD/BAT - [решено] часть имени файла LAKERS824 Скриптовые языки администрирования Windows 3 29-06-2012 08:02




 
Переход