Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Скрипт, читающий некоторые символа в первой строке нескольких файлов. (http://forum.oszone.net/showthread.php?t=349387)

Alexeyshka 13-08-2021 15:43 2964154

Скрипт, читающий некоторые символа в первой строке нескольких файлов.
 
Доброго дня!
Есть дурацкая задача - в каталог (мусорка, разных файлов много) падают определенные файлы (по имени) определенной структуры.
Задача- в шедулере поставить батник, который при наличии таких файлов (от 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 2964157

1.
пример файла в архиве чтобы видеть его структуру, кодировку и расширение
2.
Цитата:

Цитата Alexeyshka
Нужно вытащить »

куда? В отдельный файл или что делать с этим.
3.
четко не понятно что делать в цикле, кроме как вычленять что-то из файлов, а какие файлы выбирать, откуда, по какой маске или какому критерию и в какой промежуток времени, если это будет из планировщика. Или это сами сделаете?

megaloman 13-08-2021 16:42 2964158

Код:

@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



Время: 23:43.

Время: 23:43.
© OSzone.net 2001-