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

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

Fometra 23-08-2017 11:20 2760144

BAT считывающий по очереди строки
 
Нужен 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

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

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

А нужно
PHP код:

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

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

Elven 23-08-2017 11:55 2760150

Меня терзают смутные сомнения, что в текстовом файле строки именно так и пронумерованы. Сиречь:
Код:

[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 2760154

Цитата:

Цитата Fometra
Нужен 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

Цитата:

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

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

Цитата:

Цитата Elven
Меня терзают смутные сомнения, что в текстовом файле строки именно так и пронумерованы. »

Это вывод команды «find.exe /n».


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

alpap 23-08-2017 13:07 2760172

На всякий случай, если есть спецсимволы и добавлен учет пустой строки
Код:

@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 2760176

Вообще мне это нужно, чтобы по очереди подключаться к множеству 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 2760182

Цитата:

Цитата Elven
@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 2760202

Цитата:

Цитата Iska
Это вывод команды «find.exe /n». »

Это я как-то прошляпил. Спасибо.

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

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

вариант файла
Код:

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 2760216

Цитата:

Цитата Elven

Всё секурно))) Это то, что нужно, не говорите что я извращенец, была задача сделать именно так)))
Получился вот такой код:
Код:

@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!
Что не так?

Elven 23-08-2017 15:31 2760227

Упс. Строчку пропустил.
Код:

@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 2760249

Всё заработало, только добавил еще 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 2760254

Сам разобрался, всем спасибо за внимание)))
Код:

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

megaloman 23-08-2017 17:43 2760273

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 2760276

Да, об этом не подумал, в паролях есть !

mwz 23-08-2017 17:54 2760279

Цитата:

Цитата megaloman
Предлагаю взять разделителем пробел. »

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

megaloman 23-08-2017 17:56 2760280

Цитата:

Цитата mwz
А пробел в паролях тоже можно использовать »

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

alpap 23-08-2017 18:20 2760282

если есть возможность самому редактировать 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 2760283

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

alpap 23-08-2017 18:34 2760286

Цитата:

Цитата Fometra
прочитанная строка удалялась »

а вот это лишнее
удалять проще весь файл, но пока он нужен в нем можно делать изменения да и вообще хранить в качестве шаблона

megaloman 23-08-2017 19:32 2760296

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%"


Время: 09:53.

Время: 09:53.
© OSzone.net 2001-