Открываем файл и читаем его содержимое с get-content в powershell
Содержание:
Комментарии
Содержимое, отображаемое как часть текста сообщения, имеет тип метода обработки Inline .Content to be displayed as part of the message body has the disposition type of Inline. Содержимое, которое не отображается, но присоединено в отдельном файле, имеет тип метода обработки Attachment .Content that is not displayed but is attached in a separate file has the disposition type of Attachment. Свойство используется Inline для управления типом расположения вложения, связанного с экземпляром ContentDisposition .Use the Inline property to control the disposition type for the attachment associated with an instance of ContentDisposition.
Для файловых вложений можно использовать свойства, ContentDisposition чтобы задать размер файла, а также дату создания файла, последнего чтения и последнего изменения.For file attachments, you can use the properties of the ContentDisposition to set the file size, as well as the date the file was created, last read, and last modified. Для всех вложений можно задать рекомендуемое имя файла в случае, если вложение хранится на принимающем компьютере.For all attachments, you can set a recommended file name in the event that the attachment is stored on the receiving computer.
ToStringМетод возвращает заголовок Content-Disposition.The ToString method returns the Content-Disposition header. Заголовок Content-Disposition описан в документе RFC 2183, доступном по адресу https://www.ietf.org .The Content-Disposition header is described in RFC 2183 available at https://www.ietf.org.
Examples
Example 3: Display the value name and data of registry entries in a registry subkey
This command displays the value name and data of each of the registry entries contained in the
«CurrentVersion» registry subkey.
Note
This command requires that there is a PowerShell drive named that is mapped to the
«HKEY_LOCAL_MACHINE» hive of the registry.
A drive with that name and mapping is available in PowerShell by default.
Alternatively, the path to this registry subkey can be specified by using the following alternative
path that begins with the provider name followed by two colons:
.
Example 4: Get the value name and data of a registry entry in a registry subkey
This command gets the value name and data of the «ProgramFilesDir» registry entry in the
«CurrentVersion» registry subkey.
The Path specifies the subkey and the Name parameter specifies the
value name of the entry.
Example 5: Get the value names and data of registry entries in a registry key
This command gets the value names and data of the registry entries in the «PowerShellEngine»
registry key. The results are shown in the following sample output.
Захват целого файла
Теперь мы переходим к рассмотрению некоторых уникальных возможностей PHP для обработки файлов: обработка больших блоков данных в одной или двух строках. Например, как можно захватить файл и вывести все его содержимое на вашу Web-страницу? Что же, вы видели пример использования цикла с . Но как сделать это проще? Процесс почти смехотворно прост при использовании , которая помещает весь файл в строку.
$my_file = file_get_contents("myfilename"); echo $my_file;
Хотя это и не лучший вариант, вы можете записать эту команду еще короче:
echo file_get_contents("myfilename");
Данная статья в первую очередь посвящена обработке локальных файлов, однако, стоит отметить, что вы можете также захватить, отобразить и проанализировать другие Web-страницы с помощью описанных функций.
echo file_get_contents("http://127.0.0.1/");
Это команда фактически та же, что и:
$fh = fopen("http://127.0.0.1/", "r"); fpassthru($fh);
Должно быть, вы смотрите на эти примеры и думаете, «Это все-таки слишком трудоемкий способ». PHP-разработчики согласны с вами. Поэтому вы можете сократить приведенную выше команду до:
readfile("http://127.0.0.1/");
Функция передает на вывод все содержимое файла или Web-страницы в выходной буфер по умолчанию. По умолчанию эта команда выводит сообщение об ошибке при сбое. Во избежание такого поведения (если вы этого хотите), попробуйте команду:
@readfile("http://127.0.0.1/");
Конечно, если вам необходимо обрабатывать содержимое файлов, то одна строка, возвращаемая — это, пожалуй, слишком. Вы, возможно, захотите сначала разбить ее на части с помощью функции .
$array = split("\n", file_get_contents("myfile"));
Но к чему вам все эти сложности, если есть идеально подходящая функция, которая сделает за вас эту работу? Функция PHP выполняет эту задачу в один шаг: она возвращает строковый массив, элементами которого являются строки файла.
$array = file("myfile");
Следует заметить, что между двумя приведенными выше примерами есть небольшое отличие. Команда удаляет знаки перехода на новую строку, тогда как при использовании команды строки массива оканчиваются знаками перехода на новую строку (также, как и при использовании ).
Возможности PHP, тем не менее, далеко превосходят описанные выше. Вы можете разбить целые .ini-файлы в стиле PHP всего одной командой . Команда применима к файлам, сходным с приведенным в Листинге 4.
Листинг 4. Пример файла .ini
; Comment name = "King Arthur" quest = To seek the holy grail favorite color = Blue Samuel Clemens = Mark Twain Caryn Johnson = Whoopi Goldberg
Следующие команды представляют файл в виде массива, а затем выводят этот массив на печать:
$file_array = parse_ini_file("holy_grail.ini"); print_r $file_array;
В результате будут получены следующие выходные данные:
Листинг 5. Выходные данные
Array ( => King Arthur => To seek the Holy Grail => Blue => Mark Twain => Whoopi Goldberg )
Конечно, вы можете заметить, что данная команда объединила разделы. Это действие по умолчанию, но вы легко можете произвести необходимую настройку, воспользовавшись вторым аргументом : , который является переменной логического типа (Boolean). Установите значение как True (истина).
$file_array = parse_ini_file("holy_grail.ini", true); print_r $file_array;
И ваши выходные данные будут иметь вид:
Листинг 6. Выходные данные
Array ( => Array ( => King Arthur => To seek the Holy Grail => Blue ) => Array ( => Mark Twain => Whoopi Goldberg ) )
PHP помещает данные в легко разбиваемый для анализа многомерный массив.
Но это лишь верхушка айсберга, если говорить об обработке файлов в PHP. Более сложные функции, например и могут помочь вам с обработкой соответственно HTML- и XML-документов. Обратитесь к разделу , чтобы получить более подробную информацию о работе этих функций. Обе они стоят внимания, если вы будете работать с файлами указанных типов, но вместо рассмотрения всех возможных типов файлов, вы можете внимательно ознакомиться с содержанием данной статьи, где есть несколько неплохих общих правил по работе с функциями, описанными мной к настоящему моменту.
Методы
Сериализует HTTP-содержимое в поток байтов и копирует его в .Serializes the HTTP content into a stream of bytes and copies it to . |
|
Сериализирует содержимое HTTP в поток байтов и копирует его в объект потока, предоставленный как параметр .Serialize the HTTP content into a stream of bytes and copies it to the stream object provided as the parameter. |
|
Сериализирует содержимое HTTP в поток байтов и копирует его в объект потока, предоставленный как параметр .Serialize the HTTP content into a stream of bytes and copies it to the stream object provided as the parameter. |
|
Сериализирует содержимое HTTP в поток байтов и копирует его в объект потока, предоставленный как параметр .Serialize the HTTP content into a stream of bytes and copies it to the stream object provided as the parameter. |
|
Сериализирует содержимое HTTP в поток байтов и копирует его в объект потока, предоставленный как параметр .Serialize the HTTP content into a stream of bytes and copies it to the stream object provided as the parameter. |
|
Сериализация содержимого HTTP в поток в памяти в качестве асинхронной операции.Serialize the HTTP content to a memory stream as an asynchronous operation. |
|
Выполняет сериализацию содержимого HTTP в поток в памяти в качестве асинхронной операции.Serializes the HTTP content to a memory stream as an asynchronous operation. |
|
Освобождает неуправляемые ресурсы и удаляет управляемые ресурсы, используемые объектом HttpContent.Releases the unmanaged resources and disposes of the managed resources used by the HttpContent. |
|
Освобождает неуправляемые ресурсы, используемые объектом HttpContent, и опционально удаляет управляемые ресурсы.Releases the unmanaged resources used by the HttpContent and optionally disposes of the managed resources. |
|
Определяет, равен ли указанный объект текущему объекту.Determines whether the specified object is equal to the current object. (Унаследовано от Object) |
|
Служит хэш-функцией по умолчанию.Serves as the default hash function. (Унаследовано от Object) |
|
Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance. (Унаследовано от Object) |
|
Сериализация содержимого HTTP в буфер памяти в виде асинхронной операции.Serialize the HTTP content to a memory buffer as an asynchronous operation. |
|
Сериализация содержимого HTTP в буфер памяти в виде асинхронной операции.Serialize the HTTP content to a memory buffer as an asynchronous operation. |
|
Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object. (Унаследовано от Object) |
|
Сериализация содержимого HTTP в массив байтов в виде асинхронной операции.Serialize the HTTP content to a byte array as an asynchronous operation. |
|
Сериализация содержимого HTTP в массив байтов в виде асинхронной операции.Serialize the HTTP content to a byte array as an asynchronous operation. |
|
Сериализует HTTP-содержимое и возвращает поток, представляющий содержимое.Serializes the HTTP content and returns a stream that represents the content. |
|
Сериализует HTTP-содержимое и возвращает поток, представляющий содержимое.Serializes the HTTP content and returns a stream that represents the content. |
|
Сериализует HTTP-содержимое и возвращает поток, представляющий содержимое в асинхронной операции.Serialize the HTTP content and return a stream that represents the content as an asynchronous operation. |
|
Сериализует HTTP-содержимое и возвращает поток, представляющий содержимое в асинхронной операции.Serialize the HTTP content and return a stream that represents the content as an asynchronous operation. |
|
Сериализация содержимого HTTP в строку в качестве асинхронной операции.Serialize the HTTP content to a string as an asynchronous operation. |
|
Сериализация содержимого HTTP в строку в качестве асинхронной операции.Serialize the HTTP content to a string as an asynchronous operation. |
|
При переопределении в производном классе сериализует HTTP-содержимое в поток.When overridden in a derived class, serializes the HTTP content to a stream. В противном случае создается исключение NotSupportedException.Otherwise, throws a NotSupportedException. |
|
Сериализация содержимого HTTP в поток в качестве асинхронной операции.Serialize the HTTP content to a stream as an asynchronous operation. |
|
Сериализация содержимого HTTP в поток в качестве асинхронной операции.Serialize the HTTP content to a stream as an asynchronous operation. |
|
Возвращает строку, представляющую текущий объект.Returns a string that represents the current object. (Унаследовано от Object) |
|
Определяет, имеет ли содержимое HTTP допустимую длину в байтах.Determines whether the HTTP content has a valid length in bytes. |
Пример 3
C:\PS>add-content -path monthly.txt -value (get-content c:\rec1\weekly.txt) Описание ----------- В результате выполнения данной команды содержимое файла Weekly.txt записывается в конец файла Monthly.txt. В данной команде для извлечения содержимого файла Weekly.txt используется командлет Get-Content, затем содержимое передается командлету Add-Content через параметр Value. Использование круглых скобок гарантирует, что командлет Add-Content начнет работу только после завершения работы Get-Content. Также можно скопировать содержимое файла Weekly.txt в переменную, например $w, а затем с помощью параметра Value передать ее командлету Add-Content. В этом случае команда примет вид "add-content -path monthly.txt -value $w".
Получаем последний статус Twitter
С помощью PHP и cURL очень просто получить статус определённого пользователя. Данную информацию можно выводить в блоге.
function get_status($twitter_id, $hyperlinks = true) { $c = curl_init(); curl_setopt($c, CURLOPT_URL, "http://twitter.com/statuses/user_timeline/$twitter_id.xml?count=1"); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); $src = curl_exec($c); curl_close($c); preg_match('/<text>(.*)<\/text>/', $src, $m); $status = htmlentities($m); if( $hyperlinks ) $status = ereg_replace("]+://]+/]", '<a href="%5C%22%5C%5C0%5C%22">\\0</a>', $status); return($status); }
Использовать функцию очень просто:
echo get_status('catswhocode');
Разбор данных с фиксированной длиной с помощью функции unpack()
В современном мире, наполненном данными в формате XML и JSON, может показаться, что данные с фиксированной длиной вымерли… что будет роковой ошибкой. Существует большой объем данных, которые используют формат с фиксированной длиной: некоторые журнальные записи, MARC 21 (библиографическая информация), NACHA (финансовая информация), и тому подобное. Поэтому приходится беспокоиться о поддержке работы с таким данными.
Работа с данными в формате с фиксированной длиной относительно просто реализуется в языках программирования, подобных С. Так как после загрузки в память, данные выравниваются в соответствующие структуры. Но в динамических языках программирования, подобных PHP, работа с такими данными превращается в тяжкий труд, результатом которого часто становится появление следующего кода:
<?php // Разбор заголовка записи NACHA $row = fread($fp, 94); $header = array(); $header = substr($row, 0, 1); $header = substr($row, 1, 2); $header = substr($row, 3, 10); $header = substr($row, 13, 10); $header = substr($row, 23, 6); $header = substr($row, 29, 4); $header = substr($row, 33, 1); $header = substr($row, 34, 3); $header = substr($row, 37, 2); $header = substr($row, 39, 1); $header = substr($row, 40, 23); $header = substr($row, 63, 23); $header = substr($row, 86, 8); print_r($header);
Такой код слишком громоздок и уязвим для глупых, трудно выявляемых ошибок индексов. Но ему есть альтернатива: функция .
Описание функции гласит: “Распаковывает данные из бинарной строки в массив согласно заданному формату” и представляет несколько примеров использования для данных в бинарном формате. Не вполне очевидно, что данная функция может быть использована для работы с данными в формате с фиксированной длиной благодаря коду формата ‘A’, который представляет символ (любая строка является набором битов и байтов).
С помощью функции выше приведенный пример можно изменить следующим образом:
<?php // Разбор заголовка записи NACHA $row = fread($fp, 94); $header = unpack("A1type/A2priority/A10immDest/A10immOrigin/" . "A6date/A4time/A1sequence/A3size/A2blockFactor/A1format/" . "A23destName/A23originName/A8reference", $row); print_r($header);
Строка формата в данном случае является серией кодов A, с указанием количества символов для соответствующего поля, и имени ключа для таблицы результата с разделением через слэш. Например, соответствует 6 символам и будет доступно как .
Автозагрузка классов
Файлы автозагружаемых классов обычно располагаются в общем месте. Но вам может не нравится раздутый каталог или тяжеловесные автозагрузчики, которые имеются в большинстве библиотек PHP, или есть желание использовать собственное решение. к счастью, возможно использовать собственный минимальный загрузчик, который будет соответствовать стандарту PSR-0.
Стандарт не описывает функционал, который должен обеспечивать совместимый с PSR-0 автозагрузчик (методы регистрации, опции конфигурации и так далее). Если он может автоматически находить определение класса по шаблону пути , то он соответствует PSR-0. Более того, нет жестких требований для директории шаблона . Дополнительным грузом большинства автозагрузчиков является соглашение о том, что нужно указывать расположение файлов в коде. Но в таком требовании нет необходимости, если просто используется директория в дереве включений PHP.
<?php spl_autoload_register(function ($classname) { $classname = ltrim($classname, "\\"); preg_match('/^(.+)?(+)$/U', $classname, $match); $classname = str_replace("\\", "/", $match) . str_replace(, "/", $match) . ".php"; include_once $classname; });
Магия данного кода заключается в использовании регулярного выражения, которое разделяет имя на составляющие части: имя класса попадет в , а в будет содержаться название пространства имен (которое может быть и пустой строкой).
Сокеты, multipart/form-data
// устанавливаем соединение с сервером $fp = fsockopen('server.com', 80, $errno, $errstr, 30); if (!$fp) die($errstr.' ('.$errno.')'); $name = 'Евгений'; $message = 'Какое-то сообщение от пользователя'; $file = 'image.jpg'; // содержимое файла $content = file_get_contents($file); // разделитель $boundary = md5(uniqid(time())); $body = '--'.$boundary."\r\n"; $body = $body.'Content-Disposition: form-data; name="name"'."\r\n\r\n"; $body = $body.$name."\r\n"; $body = $body.'--'.$boundary."\r\n"; $body = $body.'Content-Disposition: form-data; name="message"'."\r\n\r\n"; $body = $body.$message."\r\n"; $body = $body.'--'.$boundary."\r\n"; $body = $body.'Content-Disposition: form-data; name="upload"; filename="image.jpg"'."\r\n"; $body = $body.'Content-Type: image/jpeg'."\r\n"; $body = $body.'Content-Transfer-Encoding: binary'."\r\n\r\n"; $body = $body.$content."\r\n"; $body = $body.'--'.$boundary.'--'; // пишем в сокет метод, URI и протокол fwrite($fp, 'POST /get.php HTTP/1.1'."\r\n"); // а также имя хоста fwrite($fp, 'Host: server.com'."\r\n"); // отправляем заголовки fwrite($fp, 'Content-Type: multipart/form-data; boundary='.$boundary."\r\n"); fwrite($fp, 'Content-Length: '.strlen($body)."\r\n\r\n"); // теперь передаем данные fwrite($fp, $body); // получаем ответ $result = ''; while ( !feof($fp) ) $result .= fgets($fp, 1024); // закрываем соединение fclose($fp); // выводим ответ в браузер echo $result;
Файл get.php на сервере http://server.com:
print_r( $_POST ); print_r( $_FILES ); move_uploaded_file($_FILES'upload''tmp_name', 'image.jpg')
Результат:
HTTP/1.1 200 OK Server: Apache/2.0 (Win32) PHP/5.1 X-Powered-By: PHP/5.1 Content-Length: 310 Array ( => Евгений => Какое-то сообщение от пользователя ) Array ( => Array ( => image.jpg => image/jpeg => C:\Windows\Temp\phpA457.tmp => 0 => 416919 ) )
Проверка http заголовков с помощью Curl
Для проверки заголовков мы тоже можем использовать утилиту curl. Чтобы вывести заголовки страницы запустите ее с опцией -I:
Здесь отображается код ответа сервера, а также принятые http заголовки. Из них мы можем сделать такие выводы:
- Страница сгенерирована в nginx 1.10.2;
- Это обычная html страница (text/html);
- Размер страницы 102452 байт или 100 кб;
- Страница последний раз изменялась 18:13:12 (last_modified) это очень важный параметр для поисковых систем;
- Сервер будет выдавать разные версии страниц при изменении поля Accept-Encoding (Vary);
- Страница может храниться в любом кэше (public) на протяжении часа (expires);
Таким способом может быть выполнена проверка http заголовков для любой страницы или ресурса чтобы сразу определить все ли отправляется правильно. Например, посмотрим заголовки для изображения:
Мы можем видеть, что картинка будет храниться в кэше намного дольше (max-age) чем html страница.
Осталось проверить работают ли такие заголовки, как If-Modified-Since и If-None-Match. Первый позволяет выполнять проверку актуальности кэша по дате модификации, второй — по контрольной сумме поля ETag. Кэш очень важен, чтобы снизить нагрузку на ваш сервер. Если страница не изменилась, то сервер лишь сообщает что она не изменилась, отправляя код ответа 304, вместо передачи полного файла.
Конечно, вы можете использовать для этого онлайн сервисы, но работают они плохо и не всегда показывают верное значение. Поэтому пользуемся опять curl.
Проверка If-Modified-Since
Сначала запрашиваем нашу страницу для просмотра заголовков http, а затем копируем поле Last-Modified:
Теперь запрашиваем ее еще раз, но уже с заголовком If-Modified-Since: и ваша дата:
В ответ вы должны получить не саму страницу, а только заголовок HTTP/1.1 304 Not Modified. Если так, значит проверка кода ответа сервера пройдена и все работает верно.
Проверка If-None-Match
Заголовок If-None-Match работает похожим образом, только здесь используется значение контрольной суммы кэша из поля ETag. Опять запросим нашу страницу и скопируем сумму:
Затем отправим полученную сумму с заголовком:
И снова мы должны получить ответ 304, страница не изменена.
Проверка сжатия
Сжатие позволяет уменьшить размер передаваемых данных, но в то же время создает дополнительную нагрузку на сервер. Чтобы проверить поддерживает ли сервер сжатие gzip нужно отправить в запросе заголовок Accept-Encoding с параметром gzip:
В ответе мы увидим поле Content-Encoding: gzip. Это будет означать, что сжатие используется.
Examples
Example 1: Get the content of a text file
This example gets the content of a file in the current directory. The LineNumbers.txt file contains 100 lines in the format, This is Line X and is used in several examples.
The array values 1-100 are sent down the pipeline to the ForEach-Object cmdlet. ForEach-Object uses a script block with the Add-Content cmdlet to create the LineNumbers.txt file. The variable $_ represents the array values as each object is sent down the pipeline. The Get-Content cmdlet uses the Path parameter to specify the LineNumbers.txt file and displays the content in the PowerShell console.
Example 2: Limit the number of lines Get-Content returns
This command gets the first five lines of a file. The TotalCount parameter is used to gets the first five lines of content. This example uses the LineNumbers.txt file that was created in Example 1.
Example 3: Get a specific line of content from a text file
This command gets a specific number of lines from a file and then displays only the last line of that content. The TotalCount parameter gets the first 25 lines of content. This example uses the LineNumbers.txt file that was created in Example 1.
The Get-Content command is wrapped in parentheses so that the command completes before going to the next step. Get-Content returns an array of lines, this allows you to add the index notation after the parenthesis to retrieve a specific line number. In this case, the index specifies the last index in the returned array of 25 retrieved lines.
Example 4: Get the last line of a text file
This command gets the first line and last line of content from a file. This example uses the LineNumbers.txt file that was created in Example 1.
This example uses the Get-Item cmdlet to demonstrate that you can pipe files into the Get-Content parameter. The Tail parameter gets the last line of the file. This method is faster than retrieving all of the lines and using the index notation.
Example 5: Get the content of an alternate data stream
This example describes how to use the Stream parameter to get the content of an alternate data stream for files stored on a Windows NTFS volume. In this example, the Set-Content cmdlet is used to create sample content in a file named Stream.txt .
The Stream parameter is a dynamic parameter of the FileSystem provider. By default Get-Content only retrieves data from the primary, or $DATA stream. Streams can be used to store hidden data such as attributes, security settings, or other data.
Example 6: Get raw content
The commands in this example get the contents of a file as one string, instead of an array of strings. By default, without the Raw dynamic parameter, content is returned as an array of newline-delimited strings. This example uses the LineNumbers.txt file that was created in Example 1.
Example 7: Use Filters with Get-Content
You can specify a filter to the Get-Content cmdlet. When using filters to qualify the Path parameter, you need to include a trailing asterisk ( * ) to indicate the contents of the path.
The following command gets the content of all *.log files in the C:Temp directory.
Example 8: Get file contents as a byte array
This example demonstrates how to get the contents of a file as a ] as a single object.
The first command uses the AsByteStream parameter to get the stream of bytes from the file. The Raw parameter ensures that the bytes are returned as a ] . If the Raw parameter was absent, the return value is a stream of bytes, which is interpreted by PowerShell as ] .
Powershell Get-Member на примере свойств и методов файла
Получим список файлов из любой директории подобным образом:
Мы можем увидеть, что некоторые методы похожи на командлеты PS. Например выделенный мною будет делать примерно то же (без расширенных возможностей), что и Remove-Item:
Выполнить этот метод мы можем так:
Есть так же метод, который проверит существование файла. Для примера у нас может создаваться бэкап по определенному пути и мы хотим проверять что планировщик выполнил эту задачу. Мы можем проверить через powershell наличие файла используя Exist:
У файлов много свойств и для примера я хочу получить разные даты файлов в powershell. Я знаю, что все даты хранятся в типах данных datetime и по этому значению я могу отфильтровать:
И затем вывести:
Изменим одну из дат:
Есть так же свойство, которое покажет расширение файла в powershell: