пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

I семестр:
» СПО
» ОС
» МС

№19

1.

1. Считывание текстового файла

Функция ReadFile(ByVal FilePath), приведенная в Листинге 1, предназначена для считывания всего содержимого текстового файла. Функция ReadFile работает с текстовыми файлами формата Unicode и считывает их содержимое в некоторую переменную. В командной строке функциональным аналогом этой функции является команда Type.

Пример вызова функции ReadFile в сценарии показан ниже:

data = ReadFile _
  ("C:windowssetup.log")

В результате выполнения данной команды функция считывает содержимое файла C:windowssetup.log и сохраняет его в переменной data.

Если указанный файл не существует или является пустым, функция возвратит значение vbEmpty. Например, если после вызова функции ReadFile добавить в код сценария приведенную ниже строку:

If IsEmpty(data) _
    Then WScript.Quit

то в этом случае, если заданный файл не существует или пуст, выполнение сценария завершается.

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

data = _
    Split(ReadFile("C:oot.ini") _
    vbNewLine)

Для того чтобы вывести на консоль полученный массив строк (в данном случае это будет содержимое файла boot.ini) включите в сценарий следующие строки:

data = ReadFile(C:oot.ini)
    For Each line In data
        WScript.Echo line
    Next
    For Each line In data
        WScript.Echo line
    Next

2. Запись данных в текстовый файл

В Листинге 2 показана функция WriteFile(ByVal FilePath, ByVal Text), с помощью которой можно записывать данные в текстовые файлы. Если заданный файл не существует, то он будет создан функцией в том формате (ANSI или Unicode), который по умолчанию используется в вашей системе для текстовых файлов.

Ниже приведен пример вызова функции WriteFile(ByVal FilePath, ByVal Text):

WriteFile("C:	mpscript.log", _
  "тест записи прошел успешно")

В результате выполнения данной команды в файл C: mpscript.log будет записана строка "тест записи прошел успешно".

Если запись в файл прошла успешно, тогда функция WriteFile возвращает значение True, в противном случае будет возвращено False. Таким образом, функция WriteFile позволяет легко обрабатывать в сценариях ошибки записи в файл. Например, для того чтобы вызвать функцию и выполнить проверку успешности завершения операции записи, можно использовать следующий синтаксис:

If Not WriteFile("C:	mpscript.log", _
  "тест записи прошел успешно") Then
  'Здесь размещается код процедуры обработки проблемной ситуации
End If

В случае возникновения ошибок функция WriteFile предоставляет некоторую обратную связь, в то время как обратная связь, предоставляемая объектом FileSystemObject, обычно ограничена. Помимо несуществующих родительских папок, наиболее часто возникающими ошибками в операциях с файлами являются заблокированные файлы и отсутствие прав доступа. Обе эти проблемы приводят к появлению ошибок Permission Denied (Отказано в доступе). Далее в статье будет рассмотрена функция MakeDirectory(ByVal Path), которая исключает проблемы, обусловленные несуществующими папками.

 

2.

Конвейеризация и управление выводом команд Windows PowerShell

Ранее в "лекции 2" мы рассматривали понятие конвейеризации (или композиции) команд интерпретатора Cmd.exe, когда выходной поток одной команды перенаправлялся во входной поток другой, объединяя тем самым две команды вместе. Подобные конвейеры команд используются в большинстве оболочек командной строки и являются средством, позволяющим передавать информацию между разными процессами.

 

Механизм композиции команд представляет собой, вероятно, наиболее ценную концепцию, используемую в интерфейсах командной строки. Конвейеры не только снижают усилия, прилагаемые при вводе сложных команд, но и облегчают отслеживание потока работы в командах. Полезной чертой конвейеров является то, что они не зависят от числа передаваемых элементов, так как конвейер действует на каждый элемент отдельно. Кроме того, каждая команда в конвейере (называемая элементом конвейера) обычно передает свой вывод следующей команде в конвейере, элемент за элементом. Благодаря этому, как правило, снижается потребление ресурсов для сложных команд и возникает возможность получать выводимую информацию немедленно.

 

В оболочке PowerShell также очень широко используется механизм конвейеризации команд, однако здесь по конвейеру передается не поток текста, как во всех других оболочках, а объекты. При этом с элементами конвейера можно производить различные манипуляции: фильтровать объекты по определенному критерию, сортировать и группировать объекты, изменять их структуру (ниже мы подробнее рассмотрим операции фильтрации и сортировки элементов конвейера).

 

Конвейеризация объектов в PowerShell

Конвейер в PowerShell – это последовательность команд, разделенных между собой знаком | (вертикальная черта). Каждая команда в конвейере получает объект от предыдущей команды, выполняет определенные операции над ним и передает следующей команде в конвейере. С точки зрения пользователя, объекты упаковывают связанную информацию в форму, в которой информацией проще манипулировать как единым блоком и из которой при необходимости извлекаются определенные элементы.

 

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

 

При передаче по конвейеру объектов этой проблемы не возникает, здесь нужная информация извлекается из элемента конвейера простым обращением к соответствующему свойству объекта. Однако теперь возникает новый вопрос: каким образом узнать, какие именно свойства есть у объектов, передаваемых по конвейеру? Ведь при выполнении того или иного командлета мы на экране видим только одну или несколько колонок отформатированного текста. Например, запустим командлет Get-Process, который выводит информацию о запущенных в системе процессах:

 
PS C:\> Get-Process

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    158      11    45644      22084   126   159.69   2072 AcroRd32
     98       5     1104        284    32     0.10    256 alg
     39       1      364        364    17     0.26   1632 ati2evxx
     57       3     1028        328    30     0.38    804 atiptaxx
    434       6     2548       3680    27    21.96    800 csrss
     64       3      812        604    29     0.22   1056 ctfmon
    364      11    14120       9544    69    11.82    456 explorer
     24       2     1532       2040    29     5.34   2532 Far
 

Фактически на экране мы видим только сводную информацию (результат форматирования полученных данных), а не полное представление выходного объекта. Из этой информации не понятно, сколько точно свойств имеется у объектов, генерируемых командой Get-Process, и какие имена имеют эти свойства. Например, мы хотим найти все "зависшие" процессы, которые не отвечают на запросы системы. Можно ли это сделать с помощью командлета Get-Process, какое свойство нужно проверять у выводимых объектов?


21.06.2015; 16:13
хиты: 134
рейтинг:0
Точные науки
информатика
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь