powershell перенос строки в скрипте
Использование Escape-последовательностей в PowerShell
Практически в каждом языке программирования есть еscape-символы — специальные символы, с помощью которых можно изменять свойства следующих за ними символов. Наличие escape-символа говорит о том, что следующий за ним символ (или символы) следует обрабатывать особым образом. Комбинация escape-символа и следующих за ним символов называется escape-последовательностью.
В PowerShell в качестве escape-символа используется знак обратного апострофа (`). С его помощью можно производить следующие операции.
Экранирование переменной
$a = 200
″The value is `$a″
Примечание. Обратите внимание, что escape-последовательности обязательно должны быть заключены в кавычки.
Экранирование кавычек
В одной из предыдущих статей я описывал особенности использования кавычек в PowerShell. Напомню, что в одной строке нельзя использовать две пары одинаковых кавычек. Например следующая команды вызовет ошибку:
В этой ситуации необходимо либо использовать разные типы кавычек, либо воспользоваться escape-символом. Если поместить его перед двойными кавычками, то PowerShell интерпретирует их как обычный символ, а не как разделитель строк:
Перенос строки
Escape-символ в конце строки указывает на то, что команда будет продолжена на следующей строке. Таким образом удобно разбивать на части длинные команды. Например:
Форматирование
Некоторые escape-последовательности при использовании с кавычками создают управляющие инструкции, с помощью которых можно управлять выводом. PowerShell понимает следующие последовательности:
`0 — пустой символ (Null);
`a — звуковой сигнал передается на системный динамик;
`b — возврат (backspace);
`f — печать с новой страницы;
`n — символ новой строки;
`r — возврат в начало строки;
`t — горизонтальная табуляция;
`v — вертикальная табуляция.
Их удобно использовать в том случае, если требуется определенным образом отформатировать вывод команды. Для примера оформим выходные данные в виде таблицы:
″`0 one `t two `t three n `0 `n four `t five `t six `n seven `t eight `t nine `n `0 ″
about_Operators
Краткое описание
Описание операторов, поддерживаемых PowerShell.
Подробное описание
Оператор — это элемент языка, который можно использовать в команде или выражении. PowerShell поддерживает несколько типов операторов, помогающих управлять значениями.
Арифметические операторы
Дополнительные сведения см. в разделе about_Arithmetic_Operators.
Операторы присваивания
Дополнительные сведения см. в разделе about_Assignment_Operators.
Операторы сравнения
Дополнительные сведения см. в разделе about_Comparison_Operators.
Логические операторы
Дополнительные сведения см. в разделе about_Logical_Operators.
Операторы перенаправления
Дополнительные сведения см. в разделе about_Redirection
Операторы Split и Join
Дополнительные сведения см. в разделе about_Split и about_Join.
Операторы работы с типами
Дополнительные сведения см. в разделе about_Type_Operators.
Унарные операторы
Дополнительные сведения см. в разделе about_Arithmetic_Operators.
Специальные операторы
Специальные операторы имеют особые варианты использования, которые не помещаются в любую другую группу операторов. Например, Специальные операторы позволяют выполнять команды, изменять тип данных значения или извлекать элементы из массива.
Оператор группирования ( )
Как и в других языках, (. ) служит для переопределения приоритета операторов в выражениях. Например: (1 + 2) / 3
Однако в PowerShell существуют дополнительные поведения.
(. ) позволяет разрешить выходные данные команды участвовать в выражении. Пример.
При использовании в качестве первого сегмента конвейера, заключение команды или выражения в круглые скобки неизменно приводит к перечислению результата выражения. Если скобки заключают команду в оболочку, она выполняется до завершения со всеми данными, собранными в памяти до отправки результатов через конвейер.
Возвращает результат одной или нескольких инструкций. Для одного результата возвращает скалярное значение. Для нескольких результатов возвращает массив. Используйте этот параметр, если требуется использовать выражение в другом выражении. Например, чтобы внедрить результаты команды в строковое выражение.
Оператор части выражения массива @( )
Возвращает результат одной или нескольких инструкций в виде массива. Результат всегда является массивом из 0 или более объектов.
Синтаксис литерала хэш-таблицы @<>
Как и часть выражения массива, этот синтаксис используется для объявления хэш-таблицы. Дополнительные сведения см. в разделе about_Hash_Tables.
Оператор Call &
Выполняет команду, сценарий или блок скрипта. Оператор Call, также известный как «оператор вызова», позволяет выполнять команды, которые хранятся в переменных и представляются строками или блоками сценариев. Оператор Call выполняется в дочерней области. Дополнительные сведения об областях см. в разделе about_Scopes.
В этом примере команда сохраняется в строке и выполняется с помощью оператора Call.
Оператор Call не выполняет синтаксический анализ строк. Это означает, что нельзя использовать параметры команды в строке при использовании оператора Call.
Командлет Invoke-Expression может выполнять код, который вызывает ошибки синтаксического анализа при использовании оператора Call.
Оператор Call можно использовать для выполнения скриптов, использующих их имена файлов. В следующем примере показано имя файла скрипта, содержащего пробелы. При попытке выполнить скрипт PowerShell вместо этого отображает содержимое строки в кавычках, содержащей имя файла. Оператор Call позволяет выполнить содержимое строки, содержащей имя файла.
Дополнительные сведения о блоках скриптов см. в разделе about_Script_Blocks.
Оператор Background &
Запускает конвейер перед в фоновом режиме в задании PowerShell. этот оператор действует аналогично оператору UNIX элемента управления амперсанд ( & ), который выполняет команду до ее асинхронного выполнения в качестве задания.
Эта команда функционально эквивалентна следующему использованию Start-Job :
& фоновый оператор также является признаком конца оператора, точно так же, как оператор UNIX элемента управления амперсанд ( & ). Это позволяет вызывать дополнительные команды после & фонового оператора. В следующем примере демонстрируется вызов дополнительных команд после & оператора Background.
Это эквивалентно следующему сценарию:
Если требуется выполнить несколько команд, каждая из которых находится в собственном фоновом процессе, но все они находятся на одной строке, просто поместите их & между и после каждой команды.
Дополнительные сведения о заданиях PowerShell см. в разделе about_Jobs.
Оператор CAST [ ]
Преобразует или ограничивает объекты указанным типом. Если не удается преобразовать объекты, PowerShell выдает ошибку.
Приведение также можно выполнить, если переменная назначена с помощью нотации приведения.
Как бинарный оператор, запятая создает массив или добавляет к создаваемому массиву. В режиме выражения в качестве унарного оператора запятая создает массив только с одним элементом. Поместите запятую перед элементом.
Поскольку Write-Object предполагает аргумент, выражение должно быть заключено в круглые скобки.
В следующем примере сценарий Sample.ps1 в текущем каталоге выполняется в текущей области.
Форматирует строки с помощью метода Format строковых объектов. Введите строку формата слева от оператора и объекты, которые должны быть отформатированы с правой стороны оператора.
Если необходимо, чтобы фигурные скобки ( <> ) в форматируемой строке были заключены в квадратные скобки, их можно поэкранировать.
Дополнительные сведения см. в разделе метод String. Format и составное форматирование.
Оператор индекса [ ]
Конвейерный оператор |
Отправляет («pipe») выходные данные команды, предшествующей ей, с помощью команды, следующей за ней. Если выходные данные содержат более одного объекта («Коллекция»), оператор конвейера посылает объекты по одному за раз.
Операторы цепочки конвейеров && и ||
Условно выполняет правый конвейер в зависимости от успешности конвейера левой части.
Дополнительные сведения см. в разделе About_Pipeline_Chain_Operators.
Представляет последовательные целые числа в массиве целых чисел с учетом верхней и нижней границ.
Можно также создавать диапазоны в обратных последовательностях.
Чтобы создать диапазон символов, заключите эти символы в кавычки.
Обращается к свойствам и методам объекта. Имя члена может быть выражением.
Статический оператор члена ::
Оператор ternary можно использовать в качестве замены if-else инструкции в простых условных случаях.
Дополнительные сведения см. в разделе about_If.
В следующем примере правый операнд не вычисляется.
В следующем примере правый операнд не вычисляется.
Это экспериментальная функция. Дополнительные сведения см. в разделе about_Experimental_Features.
Следующий пример вернет значение null, не пытаясь получить доступ к имени члена пропнаме.
Аналогичным образом будет возвращено значение элемента.
Если операнд имеет значение null, доступ к элементу отсутствует, и возвращается значение null.
Работа со строками в PowerShell
Результатом работы команды в PowerShell всегда является не текст, а объект. Это касается и работы с текстом. Каждая строка является отдельным объектом со своими свойствами и методами, которыми можно пользоваться для обработки текста.
Для примера создадим переменную, в которую поместим строку, а затем выведем ее свойства и методы:
$string = ″My name is Kirill″
$string | Get-Member
Свойства
Начнем со свойств, которых у строки оказалось немного — всего два. Свойство Length содержит длину строки, или количество символов:
А свойство Chars позволяет обращаться к любому символу в строке по его номеру, например:
Кстати, к символам в строке можно обращаться без использования Chars, а как к элементам массива, по индексу:
А если указать отрицательное число, то массив будет перебираться с конца:
Также кроме одного символа можно указать диапазон, например:
Методы
Теперь возьмем строку и начнем над ней издеваться приступим к методам.
Метод Remove удаляет символы из строки начиная с указанного символа, например:
Метод Replace находит в исходной строке подстроку и заменяет ее на другую, например:
Метод Split разбивает строку на массив строк с помощью разделяющего символа или группы символов. Например так мы разобьем строку, используя в качестве разделителя пробел:
А так укажем в качестве разделителя букву е:
Если необходимо указать несколько разделителей, то достаточно просто перечислить их через запятую:
Метод Substring позволяет получить подстроку, сформированную из исходной строки. Есть два варианта использования этого метода. К примеру результатом выполнения следующей команды будет строка, полученная путем удаления из исходной строки заданного количества символов:
А таким способом мы получим подстроку, сформированную из исходной строки, начинающуюся с указанной позиции (8) и содержащую указанное количество символов (9):
Метод Clone создает точную копию исходного объекта, например:
Метод CompareTo производит сравнение двух строк и выдает 0, если строки совпадают:
Метод Equals также сравнивает две строки и в зависимости от результата возвращает True или False:
Кстати, такой же результат получается при использовании оператора сравнения -eq:
Метод Contains проверяет наличие в строке указанной подстроки, и в зависимости от результата возвращает True или False. Например:
Метод StartsWith проверяет, начинается ли строка с указанной подстроки:
а метод EndsWith проверяет, заканчивается ли исходная строка подстрокой:
Обратите внимание, что эти методы также чувствительны к регистру символов.
Говоря о зависимости от регистра символов, стоит упомянуть еще два метода. Метод ToUpper переводит исходную строку в верхний регистр:
а метод ToLower соответственно в нижний:
С их помощью можно избавиться от регистрозависимости, например при поиске или сравнении:
Метод IndexOf находит индекс начала вхождения подстроки в исходной строке. Например, создадим строковую переменную:
$string = ″substring one, substring two, substring three″
Теперь выведем индекс начала вхождения подстроки (substring):
Как видите, метод выдал 0 — это номер первого символа ( s ubstring one, substring two, substring three) в исходной строке.
Метод LastIndexOf показывает индекс последнего вхождения подстроки, т.е. номер начала последнего вхождения указанной подстроки в исходной строке. Например, следующая команда выдаст 30 — номер последнего символа (substring one, substring two, s ubstring three) в строке:
Метод IndexOfAny возвращает первое, а метод LastIndexOfAny — последнее вхождение любого символа из подстроки в исходной строке. Например:
Эта команда, как и в случае с IndexOf выдаст 0 — номер первого символа (s) в строке. А так мы получим 42 — номер последнего символа подстроки (substring one, substring two, substrin g three) в строке:
$string = ″my name is Vasya Pupkin″
$string.Length
Как видите, строка содержит 23 символа. Дополним ее точками до 26 символов слева:
а получившуюся строку дополним знаками вопроса до 30 символов справа:
В принципе, процесс можно не разбивать на части, а дополнить сразу с двух сторон:
Методы TrimStart, TrimEnd и Trim обрезают повторяющиеся символы по бокам строки. TrimStart обрезает символы в начале, TrimEnd в конце строки, а Trim — с обоих сторон сразу. В качестве примера возьмем получившуюся в прошлый раз строку и обрежем лишние точки в начале:
и лишние знаки вопроса в конце:
Немного о типах данных. Текущий тип данных можно посмотреть с помощью метода GetType, например:
$a = ″string ″
$a.GetType()
В поле Name указан тип данных String (строка).
Строковые данные можно преобразовать в другой тип данных, для чего у строки имеется ряд методов. Для примера возьмем метод ToCharArray и с его помощью преобразуем строку в массив символов:
Если теперь проверить тип данных, то вместо String мы увидим тип Char[].
Преобразовать тип данных можно и с помощью статического метода Convert. Для примера создадим переменную, содержащую строку, а затем преобразуем ее в число (Int32);
$string = ″123″
$int = [convert]::ToInt32($string)
Статические методы
Методов много, поэтому коротко пробежимся по некоторым из них.
Метод Concat используется для объединения нескольких строк. В качестве примера создадим три стоковых переменных и объединим их:
$a = ″one″
$b = ″two″
$c = ″three″
[string]::Concat($a,$b,$c)
Метод Join также объединяет несколько строк, но с использованием заданного разделителя. Например, объединим строки используя в качестве разделителя двоеточие:
Метод Copy создает точную копию исходной строки:
Метод Compare производит сравнение двух строк и выдает 0 при их совпадении или 1\-1 при несовпадении, аналогично методу CompareTo:
Метод Equals также производит сравнение и выдает результат в виде True\False:
$a = ″string″
$b = ″String″
А теперь сравним их. Эта команда покажет, что строки идентичны:
А эта — что они различаются:
И еще пара интересных методов для проверки строк. Метод IsNullOrEmpty проверяет наличие строки, а также не является ли она пустой строкой:
Метод IsNullOrWhiteSpace тоже проверяет наличие строки, а также то, что строка содержит только white-space символы (пробел, табуляция, символ новой строки и т.п.):
Передача символа новой строки в PowerShell через Cmd
В демонстрационных целях входная строка затем записывается на консоль, а также выводится в файл.
У меня проблема в том, что когда скрипт запускается из cmd.exe с использованием синтаксиса
Символы новой строки в строке не рассматриваются как символы новой строки и буквально включаются как в вывод консоли, так и в выходной текстовый файл.
Однако, если я запускаю это из среды PowerShell, я получаю ожидаемый результат (т. Е. Символы новой строки анализируются правильно, а новая строка вставляется в соответствующее место).
Я получаю ожидаемый результат:
Кто-нибудь может пролить свет на то, почему это происходит?
Скрипт теста выглядит следующим образом:
И файл вызывается из командной строки как:
Сценарий работает на Windows Server 2012 R2 с использованием PowerShell v4.0
2 ответа
Параметр необходимо будет интерпретировать как строку PowerShell. Это поможет вам в будущем?
Для удобства при написании кода PowerShell язык позволяет писать:
В строке в двойных кавычках и при обработке исходного кода PowerShell (и ни в какое другое время) он будет читать их и заменять их байтами со значениями 13 и 10.
Это эта строка кода в токенайзере PowerShell, который делает это.
Например, если вы передаете ‘r’n, а затем заменяете’ r’n на ‘r’n,’ r’n все равно выводится буквально
Потому что твой код
И ваша строка, переданная извне, содержит
Функции по работе со строками в Powershell
В колонке Name отображается тип строка. Со строками часто нужно переводить их в другой регистр, измерять длину, заменять символы.
Для примера переведем строку в верхний регистр:
Или обратная операция, которая переведет строку Powershell в верхний регистр:
Можно проверить содержание символов в конце строки, которое вернет булевое значение True при положительном результате:
Обратите внимание, что регистр букв имеет значение:
Можно использовать несколько методов один за другим:
Поиск подстроки в Powershell, тоже возвращает булевое значение:
Или вернуть последний индекс последнего символа, так как в этой строке несколько букв ‘И’
Можно указать второй индекс, но нужно помнить, что после объявления первого индекса второй должен объявляться относительно первого:
Вставка новой строки по индексу:
Измерение длины строки в Powershell:
Один из самых частых методов в Powershell это преобразование строки в массив. В моем случае разделитель пробел, но может быть любой другой:
Удаление пробелов в Powershell в начале и конце строки: