Войти

Показать полную графическую версию : [решено] BAT считывающий по очереди строки


Fometra
23-08-2017, 11:20
Нужен BAT который будет читать по очереди строки из файла 1.txt и записывать их в переменную %stroka%
Т.е. нужно примерно такое


@echo off
:restart
Читаем из файла 1.txt первую строку и пишем её в переменную %stroka%
echo %stroka%
pause
goto restart


Погуглив понял что там нужен счетчик + чтение из файла
Собрал вот в такой код


@echo off
setlocal
if not exist count.txt 1>count.txt echo 0
0<count.txt set /p "count="
set /a count+=1
1>count.txt echo %count%
type count.txt

@echo off
for /f "usebackq delims=" %%i in (`find /n /v "" 1.txt ^| find "[%count%]"`) do (echo "%%i")
pause


Он работает, но выводит значения не так как нужно, выводит

1
"[1]Текст первой строки"

А нужно

Текст первой строки

Ума не приложу, как это исправить, надеюсь на вашу помощь

Elven
23-08-2017, 11:55
Меня терзают смутные сомнения, что в текстовом файле строки именно так и пронумерованы. Сиречь:
[1]Текст первой строки
[2]Текст второй строки
...
[n]Текст n-ой строки

если это так, то претензии к самому файлу, если же в файле именно строки без подобной нумерации то можно например вот так:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /F "delims=" %%i in (1.txt) do (
set stroka=%%i
echo !stroka!
pause)

хотя зачем там пауза я не совсем понимаю, но если нужно...

Iska
23-08-2017, 12:08
Нужен BAT который будет читать по очереди строки из файла 1.txt и записывать их в переменную %stroka% »
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in ("1.txt") do (
set stroka=%%i
echo !stroka!
)

endlocal
exit /b 0


Он работает, но выводит значения не так как нужно, »
Вы расскажите, что Вам нужно. Не описывайте, что как выводит, так или не так, как хотелось. Опишите Вашу задачу.

Меня терзают смутные сомнения, что в текстовом файле строки именно так и пронумерованы. »
Это вывод команды «find.exe /n».

Update: не доглядел зараз, что коллега Elven уже сделал ровно то же :(. Прошу прощения за повтор.

alpap
23-08-2017, 13:07
На всякий случай, если есть спецсимволы и добавлен учет пустой строки

@echo off
<"1.txt" (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do @set "stroka=%%b"& cmd/v/c if defined stroka ^(echo !stroka!^) else echo:)
pause

Fometra
23-08-2017, 13:17
Вообще мне это нужно, чтобы по очереди подключаться к множеству RDP, сам код подключения я нашел

cmdkey /generic:TERMSRV/168.195.218.29 /user:Administrator /pass:admin
mstsc.exe /v 168.195.218.29

Но под каждый сервер такую команду писать не выход, вот нужно, чтобы вместо IP, USER и PASS брались данные для входа из TXT-файлов (IP,LOGIN,PASS думаю разнести в 3 разных ТХТ, т.к. распарсивать строку вида 109.123.99.18:3389@SERVER\Administrator;Password для меня сложновато

Fometra
23-08-2017, 13:42
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /F "delims=" %%i in (1.txt) do (
set stroka=%%i
echo !stroka!
pause) »

Вот это почти то, что нужно, проблема в том, что пока батник не переберет все строки из файла 1.txt, дальше код БАНтика не читает

Elven
23-08-2017, 14:27
Это вывод команды «find.exe /n». »
Это я как-то прошляпил. Спасибо.
Fometra, парсить строку приведенного вида действительно не очень удобно, хотя и не невозможно, но хранить пароль в открытом виде не очень красиво и совсем не есть секурно. Для такой задачи как подключение к многочисленным рабочим столам я бы рекомендовал использовать RDCMan (https://www.microsoft.com/en-us/download/details.aspx%3Fid%3D44989) или аналоги.

Если же все же использовать вариант с файлом где все хранится в открытом виде, проще будет разместить их в файле с каким-то одним разделителем, а не с разными. Например если разделить символом "_"

109.123.99.18_Administrator_Password
192.168.1.2_user_parol
то код может быть приблизительно таким.
for /F "delims=" %%i in (1.txt) do (
for /F "tokens=1-3 delims=_" %%A in ("%%i") do (
set IP=%%A
set LOGIN=%%B
set PASS=%%C
rem тот код, куда подставляются переменные !IP! !LOGIN! !PASS!
))

Однако еще раз повторюсь - это нифига не секурно.

Fometra
23-08-2017, 15:14
»
Всё секурно))) Это то, что нужно, не говорите что я извращенец, была задача сделать именно так)))
Получился вот такой код:

@echo off
for /F "delims=" %%i in (1.txt) do (
for /F "tokens=1-3 delims=_" %%A in ("%%i") do (
set IP=%%A
set LOGIN=%%B
set PASS=%%C
cmdkey /generic:TERMSRV/!IP! /user:!LOGIN! /pass:!PASS!
mstsc.exe /v !IP!
))


Логин и пароль берет верный, а вот подключается не к IP адресу, а просто к тексту !IP!
Что не так?
http://www.picshare.ru/uploads/170823/yy31WeJa0s.png

Elven
23-08-2017, 15:31
Упс. Строчку пропустил.
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /F "delims=" %%i in (1.txt) do (
for /F "tokens=1-3 delims=_" %%A in ("%%i") do (
set IP=%%A
set LOGIN=%%B
set PASS=%%C
cmdkey /generic:TERMSRV/!IP! /user:!LOGIN! /pass:!PASS!
mstsc.exe /v !IP!
))

Fometra
23-08-2017, 16:21
Всё заработало, только добавил еще pause, чтобы при закрытии окна сервера автоматом не подключался другой, а подключался после нажатии любой кнопки

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /F "delims=" %%i in (1.txt) do (
for /F "tokens=1-3 delims=_" %%A in ("%%i") do (
set IP=%%A
set LOGIN=%%B
set PASS=%%C
cmdkey /generic:TERMSRV/!IP! /user:!LOGIN! /pass:!PASS!
mstsc.exe /v !IP!
pause
))


Последнее, что хотелось бы реализовать:
1. Подключился к серверу
2. Сделал всё, что мне нужно на нём
3. Закрыл окно MSTSC.exe
4. IP LOGIN PASS записались в >> results.txt
5. И мой комментирий >> results.txt

Пробовал вот так, но сам комментарий не записывается

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /F "delims=" %%i in (1.txt) do (
for /F "tokens=1-3 delims=_" %%A in ("%%i") do (
set IP=%%A
set LOGIN=%%B
set PASS=%%C

cmdkey /generic:TERMSRV/!IP! /user:!LOGIN! /pass:!PASS!
mstsc.exe /v !IP!


@set /p text="COMMENT: "
echo !IP! !LOGIN! !PASS! %text%>> results.txt
pause
))

Fometra
23-08-2017, 16:36
Сам разобрался, всем спасибо за внимание)))

echo !IP! !LOGIN! !PASS! !text! >> results.txt

megaloman
23-08-2017, 17:43
Fometra, ИМХО, Брать в качестве разделителя "_" не слишком хорошая идея. Могу ошибаться, но в логине это допустимый символ. А в пароле тем более, плюс "!" тоже, что может привести к неприятностям при работе батника.
Предлагаю взять разделителем пробел.
Для строки вида:
192.168.125.15 User Tra La La@Echo Off
Set "FileIn=Z:\Box_In\1.txt"
Set "FileLog=Z:\Box_Out\Results.txt"

FOR /F "usebackq tokens=1,2* delims= " %%A IN ("%FileIn%") DO Call :Connect "%%A" "%%B" "%%C"
GoTo :Eof

:Connect
cmdkey /generic:TERMSRV/%~1 /user:%~2 /pass:%~3
mstsc.exe /v %~1
set /p text="COMMENT: "
Echo %Date% %Time% %~1 %~2 %~3 %text%>>"%FileLog%"
Pause
GoTo :Eof

Fometra
23-08-2017, 17:49
Да, об этом не подумал, в паролях есть !

mwz
23-08-2017, 17:54
Предлагаю взять разделителем пробел. »

А пробел в паролях тоже можно использовать. ;)
Как раз с неделю назад в другом месте кто-то успешно опробовал, хотя и не на ftp, пароль из восьми пробелов и в шутку поинтересовался, легко ли его сбрутфорсить, в т.ч. словарной атакой.

megaloman
23-08-2017, 17:56
А пробел в паролях тоже можно использовать » Да в этом варианте хоть сто порций пробелов :).
Однако, надо следить, чтобы в конце пароля в строке не было лишних пробелов. Увы, пробелы в начале пароля будут проигнорированы. Для Вашего примера пароля из пробелов скрипт не сработает. В этом случае надо иное решение. Чтобы скрипт отработал, первым в пароле должен быть символ.

alpap
23-08-2017, 18:20
если есть возможность самому редактировать txt, то можно и так сделать, удобно, но на любителя

@echo off
:: Строки в "f.txt"
:: IP=192.168.125.15 User=user_1 Password=parol_1
:: IP=192.168.125.17 User=user_2 Password=parol_2
<f.txt (for /f "tokens=1,2*" %%a in ('more') do set "%%a"& set "%%b"& set "%%c"& call :#)
pause& exit

:#
echo "%IP%" "%User%" "%Password%"
exit /b

Fometra
23-08-2017, 18:26
В моих паролях нету пробелов, поэтому не беда.
Еще бы добавить, чтобы после чтения IP,LOGIN,PASS из файла 1.txt прочитанная строка удалялась

alpap
23-08-2017, 18:34
прочитанная строка удалялась »
а вот это лишнее
удалять проще весь файл, но пока он нужен в нем можно делать изменения да и вообще хранить в качестве шаблона

megaloman
23-08-2017, 19:32
Fometra, @Echo Off
cls

Set "FileIn=Z:\Box_In\1.txt"
Set "FileLog=Z:\Box_Out\Results.txt"

Set /A N=0
FOR /F "usebackq tokens=1,2* delims= " %%A IN ("%FileIn%") DO Call :ToMemory "%%A" "%%B" "%%C" A B C
Echo Del "%FileIn%"
FOR /L %%i IN (1,1,%N%) DO Call :Connect %%A%%i%% %%B%%i%% %%C%%i%%

GoTo :Eof

:ToMemory
Set /A N+=1
Set "%4%N%=%1"
Set "%5%N%=%2"
Set "%6%N%=%3"
GoTo :Eof

:Connect
cmdkey /generic:TERMSRV/%~1 /user:%~2 /pass:%~3
mstsc.exe /v %~1
set /p text="COMMENT: "
Echo %Date% %Time% %~1 %~2 %~3 %text%>>"%FileLog%"
Pause
GoTo :Eof
Для удаления уберите Echo перед Del "%FileIn%"




© OSzone.net 2001-2012