Войти

Показать полную графическую версию : Скрипт, читающий некоторые символа в первой строке нескольких файлов.


Alexeyshka
13-08-2021, 15:43
Доброго дня!
Есть дурацкая задача - в каталог (мусорка, разных файлов много) падают определенные файлы (по имени) определенной структуры.
Задача- в шедулере поставить батник, который при наличии таких файлов (от 0 до 30 в определенный момент времени) считывал первую строку, из нее вычленял несколько символов из нескольких позиций и в зависимости от значений делал какие-либо манипуляции с файлом (в основном - копирование с посылом сообщения).
Проблемы - файла начинаются с ~, внутри файла - разделитель |
(пример первой строки файлов
1|20210727|131511|YSN20802.742|898|898|0
1|20210727|115807|YSB20847.742|35|35|0
1|20210727|115801|YTI20825.742|5140|5140|0)
Нужно вытащить с 3 символа 18-й позиции и 2 символа с 24-й
Столкнулся с чем:
1. Если работать напрямую с файлом, то вроде норм
set /p val=<~yh2080f.742
set val1=%val:~18,3%
set val2=%val:~24,2%
echo %val1%
echo %val2%
pause

результат:
D:\cmail>echo YSN
YSN
D:\cmail>echo 02
02
D:\cmail>pause
Для продолжения нажмите любую клавишу . . .

2. если работать с циклом, то начинается приколизм
@echo off
rem Setlocal Enabledelayedexpansion Enableextensions
if not exist D:\111\?Y*.* goto end

rem echo.%%i
for %%i in ("D:\111\?Y*.*") do (
set val=
set val1=
set val2=
echo.begin
echo.%%i
set /p val=<%%i
rem set val=%val:|=1%
set val
set val1=%val:~18,3%
set val2=%val:~24,2%
echo %val1%
echo %val2%
echo .end
)
:end
echo .bye

результат
D:\111\~YH2080A.742
val=1|20210727|115712|YSB20853.742|32|31|1
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
.end

Думал, что проблема в разделителе в файле - разремил замещение разделителя на 1
получилось вообще непонятно
begin
D:\111\~YH2080A.742
"1" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

прошу помощи.

alpap
13-08-2021, 16:42
1.
пример файла в архиве чтобы видеть его структуру, кодировку и расширение
2.
Нужно вытащить »
куда? В отдельный файл или что делать с этим.
3.
четко не понятно что делать в цикле, кроме как вычленять что-то из файлов, а какие файлы выбирать, откуда, по какой маске или какому критерию и в какой промежуток времени, если это будет из планировщика. Или это сами сделаете?

megaloman
13-08-2021, 16:42
@Echo Off
cls
Set "FileIn=Z:\Box_In\~???????.???"
For %%f In ("%FileIn%") Do Call :OutFirst "%%f" 18 3 24 2
Pause
Exit /B 0

:OutFirst
Set /P First=<%1
Call Set "First1=%%First:~%2,%3%%"
Call Set "First2=%%First:~%4,%5%%"
Echo %First1% %First2% %1
Exit /B
Alexeyshka, @Echo Off
cls
For %%i In ("Z:\Box_In\~y??????.???") Do (
Set /P val=<"%%i"
Call Set "val1=%%val:~18,3%%"
Call Set "val2=%%val:~24,2%%"
Call Echo %%val1%% %%val2%% %%i
)
Pause
Exit /B 0
или так:@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion
For %%i In ("Z:\Box_In\~y??????.???") Do (
Set /P val=<"%%i"
Set "val1=!val:~18,3!"
Set "val2=!val:~24,2!"
Echo !val1! !val2! %%i
)
Pause
Exit /B 0
Если хочется увидеть на экране первую строку, то в Echo её надо взять в кавычки, так как символ "|" служебный
Call Echo %%val1%% %%val2%% %%i "%%val%%"
или так:@Echo Off
cls
For %%i In ("Z:\Box_In\~y??????.???") Do Set /P val=<"%%i" &Call :OutFirst %%val:~18,3%% %%val:~24,2%% %%i
Pause
Exit /B 0

:OutFirst
Echo %1 %2 %3
Exit /B




© OSzone.net 2001-2012