Компьютерный форум 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=133832)

tr011_tmn 04-03-2009 20:43 1055061

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


echo off
cls
set t=%time% & echo Время начала
echo %t%
...
лирика с заданием переменных
...
Echo KB925398-v2
WindowsMedia6-KB925398-v2-x86-%LANG%.exe -x:%TP% /Q /N /Z
MOVE /Y WindowsMedia6-KB925398-v2-x86-%LANG%.exe %END%
...
echo работа закончена
:exit
set t1=%time%
echo %t1%
pause


Хотелось бы понять как передать из CMD в текстовый файл (желательно с его созданием из CMD) строки или строк:
KB925398-v2 и т.д.

gora 04-03-2009 20:50 1055063

Если я правильно понял, то попробуйте так:
Код:

...
Echo KB925398-v2>test.txt
Echo WindowsMedia6-KB925398-v2-x86-%LANG%.exe -x:%TP% /Q /N /Z>>test.txt
Echo MOVE /Y WindowsMedia6-KB925398-v2-x86-%LANG%.exe %END%>>test.txt
...


tr011_tmn 04-03-2009 21:07 1055072

gora, если я вас правильно понял, то: >test.txt , это указание CMD занести в test.txt указанную строку.
А существует ли возможность не всю строку а только выборочную информацию занести в test.txt. например KB925398-v2 без echo, или например сформировать файл с определенным содержимым.
пробовал через copy /a con, но в данном случае его вручную необходимо завершать комбинацией ctrl+Z, и смысл атоматизации теряется. Или все такие есть способ внести строку KB925398-v2 и тому подобные в текстовый файл?

gora 04-03-2009 21:14 1055078

Цитата:

Цитата tr011_tmn
если я вас правильно понял, то: >test.txt , это указание CMD занести в test.txt указанную строку. »

Команда Echo KB925398-v2>test.txt заносит в файл test.txt только то что стоит после самой команды и до символа > (подчеркнуто). Один символ > , записывая строку в файл, создает его, а два символа >> только дописывают строку в уже созданный файл. Сама команда Echo в файл не попадает.

tr011_tmn 04-03-2009 21:28 1055085

gora, вот теперь мозайка начала складываться более или менее, простите за еще один глупый вопрос. Получается что :

Код:

Rem Начало файла >test.txt
Rem KB925398-v2 >>test.txt
Rem Конец файла >>test.txt

то на выходе я получу test.txt с содержимым:

Код:

Начало файла
KB925398-v2
Конец файла


gora 04-03-2009 21:56 1055112

Цитата:

Цитата tr011_tmn
то на выходе я получу test.txt с содержимым: »

Нет! Не Rem должно быть, а Echo.
Код:

Echo Начало файла>test.txt
Echo KB925398-v2>>test.txt
Echo Конец файла>>test.txt


tr011_tmn 04-03-2009 22:02 1055117

gora, теперь общий смысл понял, еще раз вам огромное спасибо

LuSP 29-05-2009 17:48 1130410

А как при этом оставить вывод в окне командной строки? Смотрел множество ресурсов - так и не разобрался. Получается, что echo выводит либо в файл, либо в окно. Как сделать "перенаправление", чтобы шло и туда и туда? Заранее спасибо.

Iska 29-05-2009 19:50 1130502

Цитата:

Цитата LuSP
А как при этом оставить вывод в окне командной строки? Смотрел множество ресурсов - так и не разобрался. Получается, что echo выводит либо в файл, либо в окно. Как сделать "перенаправление", чтобы шло и туда и туда? »

Писать две команды «echo», одну на вывод на консоль, другую — в файл.
Либо оформить подобный вывод в виде простой процедуры:
читать дальше »
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set strFileName=Test.txt

call :LikeTee "Hello World" "%strFileName%"
call :LikeTee "Привет мир" "%strFileName%"
call :LikeTee "Hello World2"
call :LikeTee

endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
:LikeTee
    setlocal enableextensions enabledelayedexpansion
   
    if "%~1"=="" (
        goto :eof
    ) else (
        echo %~1
       
        if "%~2"=="" (
            goto :eof
        ) else (
            echo %~1>>"%~2"
        )
    )
   
    endlocal
    exit /b 0
rem ==========================================================================


Либо использовать для этих целей утилиту tee, например, из комплекта Native Win32 ports of some GNU utilities:
Код:

echo Hello World|tee.exe test.txt

LuSP 29-05-2009 21:06 1130582

Iska, спасибо. К сожалению, ничего из предложенного вами мне не подходит.
Мне нужен вывод команды, а не простой текст. В случае с повтором echo придётся повторять команду, эффект от LikeTee тот же (или всё-таки можно использовать? Тогда как делать call?), саму tee ставить не вариант (планируется использование скрипта не только на своей машине).
Много чего пробовал из следующего - вообще не работает.
читать дальше »
Операторы перенаправления команд используются для изменения местоположений потоков ввода и вывода команд, заданных по умолчанию, на какие-либо другие. Местоположение потоков ввода и вывода называется дескриптор.

В следующей таблице описаны операторы перенаправления потоков ввода и вывода команд.

Оператор перенаправления


Описание

>


Записывает данные на выходе команды вместо командной строки в файл или на устройство, например, на принтер.

<


Читает поток входных данных команды из файла, а не с клавиатуры.

>>


Добавляет выходные данные команды в конец файла, не удаляя при этом существующей информации из файла.

>&


Считывает данные на выходе одного дескриптора как входные данные для другого дескриптора.

<&


Считывает входные данные одного дескриптора как выходные данные другого дескриптора.

|


Считывает выходные данные одной команды и записывает их на вход другой команды. Эта процедура известна под названием «канал».

По умолчанию, входные данные команды (дескриптор STDIN) отсылаются с клавиатуры интерпретатору команд Cmd.exe, далее Cmd.exe отправляет выходные данные команды (дескриптор STDOUT) в окно командной строки.

В следующей таблице представлены доступные дескрипторы.

дескриптор


Числовой эквивалент дескриптора


Описание

STDIN


0


Ввод с клавиатуры

STDOUT


1


Вывод в окно командной строки

STDERR


2


Ошибка вывода в окно командной строки

UNDEFINED


3-9


Эти дескрипторы определяются индивидуально для каждой прикладной программы.

Номера от 0 до 9 представляют первые 10 дескрипторов. Для запуска программы и перенаправления любого из 10 дескрипторов используется интерпретатор команд Cmd.exe. Для задания требуемого дескриптора перед оператором перенаправления введите его номер. Если дескриптор не определен, то по умолчанию оператором перенаправления ввода «<» будет ноль (0), а оператором перенаправления вывода «>» будет единица (1). После ввода оператора «<» или «>» необходимо указать, откуда читать и куда записывать данные. Можно задать имя файла или любой из существующих дескрипторов.

Для задания перенаправления в существующие дескрипторы используется амперсанд (&), затем номер требуемого дескриптора (например, &номер_дескриптора). Например, для перенаправления дескриптора 2 (STDERR) в дескриптор 1 (STDOUT) введите:

1<&2
Дублирование дескрипторов

Оператор перенаправления «&» дублирует выходные или входные данные с одного заданного дескриптора на другой заданный дескриптор. Например, для отправки выводных данных команды dir в файл File.txt и отправки ошибки вывода в файл File.txt введите:

dir>c:\file.txt 2>&1

При дублировании дескриптора происходит копирование всех его исходных характеристик. Например, если дескриптор доступен только для записи, то все его дубликаты будут доступны только для записи. Нельзя продублировать дескриптор с доступом только для чтения в дескриптор с доступом только для записи.
Перенаправление ввода команд (<)

Для перенаправления ввода команд с цифровой клавиатуры на файл или на устройство используйте оператор «<». Например, для ввода команды sort из файла List.txt введите:

sort<file.txt

Содержимое файла File.txt появится в командной строке в виде списка в алфавитном порядке.

Оператор «<» открывает заданное имя файла с доступом только для чтения. Поэтому с его помощью нельзя записывать в файл. Например, при запуске программы с оператором <&2 все попытки прочитать дескриптор 0 ни к чему не приведут, так как изначально он был открыт с доступом только для записи.

Примечание

* Дескриптор 0 задан по умолчанию для оператора перенаправления ввода «<».

Перенаправление вывода команд (>)

Выходные данные практически всех команд высвечиваются в окне командной строки. Даже команды, выводящие данные на диск или принтер, выдают сообщения и запросы в окне командной строки.

Для перенаправления вывода команд из окна командной строки в файл или на устройство применяется оператор «>». Этот оператор используется с большинством команд. Например, для перенаправления вывода команды dir в файл Dirlist.txt введите:

dir>dirlist.txt

Если файл Dirlist.txt не существует, интерпретатор команд Cmd.exe создаст его. Если файл существует, Cmd.exe заменит информацию в файле на данные, полученные от команды dir.

Для запуска команды netsh routing dump и последующей отправки результатов ее работы в Route.cfg введите:

netsh routing dump>c:\route.cfg

Оператор «>» открывает заданный файл с доступом только для записи. Поэтому с помощью данного оператора файл прочитать нельзя. Например, при запуске программы с оператором перенаправления <&0 все попытки записать дескриптор 1 ни к чему не приведут, так как изначально дескриптор 0 был открыт с доступом только для чтения.

Примечание.

* Дескриптор 1 задан по умолчанию для оператора перенаправления вывода «>».

Использование оператора «<&» для перенаправления ввода и дублирования

Для использования оператора перенаправления ввода необходимо, чтобы задаваемый файл уже существовал. Если файл для ввода существует, то интерпретатор команд Cmd.exe открывает его с доступом только для чтения и его содержимое отправляет в команду так, как если бы это был ввод с цифровой клавиатуры. При задании дескриптора интерпретатор команд Cmd.exe дублирует его в дескриптор, существующий в системе.

Например, для считывания файла File.txt на вход в дескриптор 0 (STDIN) введите:

<file.txt

Для открытия файла File.txt, сортировки его содержимого и последующей отправки в окно командной строки (STDOUT) введите:

sort<file.txt

Для того чтобы найти файл File.txt и перенаправить дескриптор 1 (STDOUT) и дескриптор 2 (STDERR) в Search.txt введите:

findfile file.txt>search.txt 2<&1

Для дублирования определенного пользователем дескриптора 3 в качестве входной информации для дескриптора 0 (STDIN) введите:

<&3
Использование оператора «>&» для перенаправления ввода и дублирования

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

Для дублирования определенного пользователем дескриптора 3 в дескриптор 1 введите:

>&3

Для перенаправления всех выходных данных, включая выходные данные дескриптора 2 (STDERR), команды ipconfig в дескриптор 1 (STDOUT) и последующего перенаправления выходных данных в Output.log введите:

ipconfig.exe>>output.log 2>&1
Использование оператора «>>» для добавления вывода

Для добавления выходных данных команды в конец файла без потери хранящейся в нем информации используется двойной символ «больше» (>>). Например, следующая команда добавляет список каталогов, созданный командой dir, в файл Dirlist.txt:

dir>>dirlist.txt

Для добавления выходных данных команды netstat в конец файла Tcpinfo.txt введите:

netstat>>tcpinfo.txt
Использование оператора канала (|)

Оператор канала «вертикальная линия» (|) забирает выходные данные одной команды (по умолчанию STDOUT) и направляет их на вход другой команды (по умолчанию STDIN). Например, следующая команда сортирует каталог:

dir | sort

В данном примере обе команды запускаются одновременно, но команда sort приостанавливает работу до получения выходных данных команды dir. Команда sort использует выходные данные команды dir в качестве своих входных данных, а затем свои выходные данные отправляет в дескриптор 1 (STDOUT).
Комбинирование команд с операторами перенаправления

Комбинируя команды-фильтры с другими командами и именами файлов, можно создавать команды на заказ. Например, для сохранения имен файлов, содержащих строку «LOG», используется следующая команда:

dir /b | find "LOG" > loglist.txt

Выход команды dir отсылается в команду-фильтр find. Имена файлов, содержащие строку «LOG», хранятся в файле Loglist.txt в виде списка (например, NetshConfig.log, Logdat.svd и Mylog.bat).

При использовании более одного фильтра в одной команде их необходимо отделять с помощью канала (|). Например, следующая команда ищет в каждом каталоге диска C файлы, в названии которых присутствует строка «Log», и выводит их постранично на экран:

dir c:\ /s /b | find "LOG" | more

Наличие канала (|) указывает Cmd.exe, что выход команды dir нужно отправить команде-фильтру find. Команда find выбирает только те имена файлов, в которых содержится строка «LOG». Команда more выводит на экран имена файлов, полученные командой find с паузой после заполнения каждого экрана.

BumbleBee 13-07-2009 19:36 1166671

Здравствуйте! Пытался перенаправить инфу из командной строки в текстовый файл и все бы хорошо, да только в текстовом файле ничего прочесть не могу - не понятные мне (да я думаю и другим тоже) символы или одним словом крякозябра какая-то. кодировка в командной стрке стандартная 866. Но если ее поменять на 1251, то в текстовом файле все читаемо, но не читаемо в самой командной строке. Вопрос у меня такой - а можно эти "полезные качества" как-нибудь объединить - чтобы и в командной строке читалось все и в текстовом файле тоже. Заранее большое вам человеческое спасибо!

NiOl 14-07-2009 16:42 1167471

Ну, смотря чем читать... :tongue:

Коммандная строка (она же "приглашение ДОС / DOS prompt") работает в ОЕМ-кодировке, в ней же хранятся и имена файлов на дисках, когда используется не-латиница, а народ привык к винде.

Вывод - при работе со скриптами пользоваться сторонними просмотрщиками (входят в состав почти любого "командЕра") или выбрать что-угодно по вкусу, такие программы обычно понимают множество кодировок, а иногда даже умеют определять текущую кодировку.

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


Время: 23:03.

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