Как я могу проверить, является ли строка пустой или пустой в powershell?

Другие вопросы по пользованию

У многих возникает вопрос, как узнать версию PowerShell? Для этого выполните следующее:

  1. Откройте приложение.
  2. Введите $PSVersionTable.
  3. Если это ни к чему не привело, значит, у вас версия 1.0 — для неё есть команда $
  4. В ином случае появится подробная информация о том, какая версия приложения установлена на ПК.

Ещё один вопрос, на который стоит дать ответ — как удалить PowerShell? Для этого потребуются такие действия:

  • Зайдите через Панель управления в меню установки и удаления программ.
  • Найдите ветку Microsoft Windows
  • Удалите обновление для компонента WindowsPowerShell , следуйте инструкциям системы.

Типы значений

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

У некоторых типов не предусмотрено значение для преобразования из . Такие типы при обработке вызывают ошибку .

Параметры функции

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

Как только вы задаете тип параметра , его значение не может быть . Обычно принято выполнять проверку на соответствие , чтобы выяснить, предоставил ли пользователь значение.

Если значение не указано, является пустой строкой . Вместо этого используйте автоматическую переменную .

содержит только параметры, указанные при вызове функции.
Для проверки свойства можно также использовать метод .

IsNotNullOrEmpty

Если значение является строкой, можно использовать статическую строковую функцию для проверки того, является ли значение или пустой строкой одновременно.

Я часто так делаю, когда знаю, что тип значения должен быть строкой.

10 ответов

Лучший ответ

Эта проблема была исправлена ​​в .NET 2.0 с пакетом обновления 1 (sp1). Нет причин избегать его использования сейчас.

Если вы используете .NET 2, у вас в любом случае должен быть sp1 по многим другим причинам — я не вижу причин избегать этого из-за ошибки, которой больше не существует.

24

Reed Copsey
6 Ноя 2009 в 22:40

Я слышал об этой ошибке раньше, и, насколько я могу судить, она никогда не встречается ни в каком реальном коде, а только в коде, подобном приведенному в примере, который на самом деле ничего не делает. Кроме того, ошибка не в самом методе IsNullOrEmpty, поэтому она может возникнуть независимо от того, как вы проверяете строку.

Если метод делает именно то, что вы хотите, вы должны его использовать. Однако не следует использовать его в каждой ситуации для проверки наличия пустой строки. Иногда вам нужно только проверить, пуста ли строка, а не нулевая.

Если строковая переменная имеет значение null, это просто пропустит блок кода:

Если строковая переменная имеет значение NULL, это вызовет исключение:

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

5

Guffa
6 Ноя 2009 в 22:47

Вы можете написать модульный тест, который передает пустую строку и тот, который передает пустую строку, чтобы проверить этот материал, и запустить его в VS2005, а затем в 2008 году и посмотреть, что произошло

4

Omu
6 Ноя 2009 в 22:42

В этом отчете об ошибке в ссылке, которую вы включаете, говорится:

В этом случае не имеет значения, используете ли вы VS 2005, если у вас установлен SP1 для .NET 2.

Что касается того, использовать ли его, ознакомьтесь с этим сообщением CodingHorror.

3

James Black
6 Ноя 2009 в 22:44

Мы используем метод расширения для :

При использовании этого подхода, даже если он был сломан в какой-то предыдущей версии, исправление ошибки — это только одна строка кода.

И дополнительная утилита, позволяющая использовать метод для экземпляра строки, которая может иметь значение NULL:

3

Yannick Motton
6 Ноя 2009 в 22:47

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

2

Kevin Kibler
3 Фев 2010 в 19:12

Я почти уверен, что это было исправлено в SP1, но в любом случае вы можете создать свой собственный нулевой или пустой метод :)

1

Hannoun Yassir
6 Ноя 2009 в 22:43

Как и в случае с любым языком или его частью, все дело в знании плюсов и минусов и принятии обоснованного решения на основе этой информации. ИМХО.

1

jaywon
6 Ноя 2009 в 22:45

Если в вашей версии он не работает, то просто иметь статический метод, который будет выполнять проверку, тривиально, поэтому просто выполните:

Нет смысла вдаваться в серьезную проблему из-за того, что должно быть относительно легко исправить.

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

James Black
6 Ноя 2009 в 22:40

Интересно, почему люди используют string.Empty, это нехорошо, потому что это инициализированная строка, и эта концепция существует только в .Net-фрейме, везде это допустимая строка с len, равным 0 (серверы db очень четко определяют назначение между этим и будут жаловаться если у вас есть логическая проверка на null, но вы получаете пустую строку). Я думаю, что string.IsNullOrEmpty — одна из пяти худших практик / функций, которые я когда-либо видел, потому что она каким-то образом побуждает / заставляет людей выглядеть нормально, чтобы они инициализировали свои строки, и может рассматриваться как null. Эту функцию никогда не следовало добавлять, и я думаю, что ребята из .Net должны попытаться отказаться от нее :) Кому вообще нужна пустая строка? Я никогда не использовал его, кроме случаев, когда мне приходилось использовать его в существующих проектах.

-5

Ivo S
3 Фев 2010 в 18:43

Когда я выполняю проверку на соответствие $null

Когда я пишу код, то стараюсь предусмотреть все варианты. Вызывая функцию и присваивая ее переменной, я проверяю ее на соответствие .

Я предпочитаю использовать или , а не . Не поймите мене неправильно, я часто пользуюсь . Но если я могу задать проверку на состояния ошибки или пустой набор результатов, я могу обеспечить обработку реальных исключений.

Я стараюсь проверять на соответствие перед индексацией в значение или вызовом методов для объекта. Оба этих действия не срабатывают для объектов , поэтому сначала нужно их проверить. Эти сценарии уже рассматривались ранее в этой статье.

Сценарий без результатов

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

Вам нужно выяснить, как используемые вами команды работают со сценариями без результатов и сценариями ошибок.

Предусловия: AllowNull и DisallowNull

Рассмотрим свойство для чтения и записи, которое никогда не возвращает , так как имеет разумное значение по умолчанию. Вызывающие объекты передают методу доступа set при задании ему этого значения по умолчанию. Например, рассмотрим систему обмена сообщениями, запрашивающую имя экрана в комнате чата. Если имя не указано, система создает случайное значение.

При компиляции предыдущего кода в контексте, игнорирующем допустимость значения NULL, не возникает никаких проблем. После включения ссылочных типов, допускающих значения NULL, свойство преобразуется в ссылку, не допускающую значение NULL. Это верно для метода доступа : он никогда не возвращает . Вызывающим объектам не нужно проверять возвращаемое свойство на наличие значения . Но теперь при задании свойству значения создается предупреждение. Чтобы включить поддержку этого типа кода, добавьте атрибут System.Diagnostics.CodeAnalysis.AllowNullAttribute к свойству, как показано в следующем коде.

Чтобы использовать этот и другие атрибуты, описанные в этой статье, может потребоваться добавить директиву для пространства имен System.Diagnostics.CodeAnalysis. Атрибут применяется к свойству,а не методу доступа . Атрибут позволяет определить предусловия и применяется только к аргументам. Метод доступа имеет возвращаемое значение, но у него нет параметров. Таким образом, атрибут применяется только к методу доступа .

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

  1. Общий контракт для этой переменной заключается в том, что она не должна принимать значение , поэтому нужен ссылочный тип, не допускающий значение NULL.
  2. Существуют ситуации, когда вызывающий объект передается в в качестве аргумента, хотя это не самый распространенный способ использования.

Чаще всего этот атрибут будет необходим для свойств или аргументов , и . Атрибут лучше всего применять в ситуации, когда переменная обычно имеет значение, отличное от NULL, но необходимо разрешить в качестве предусловия.

Сравните этот вариант со сценариями использования : этот атрибут используется для указания того, что аргумент ссылочного типа, допускающего значение NULL, не должен иметь значение . Рассмотрим свойство, где является значением по умолчанию, но клиенты могут задать для него только значение, отличное от NULL. Рассмотрим следующий код.

Предыдущий код лучше всего демонстрирует ваше намерение выразить то, что атрибут может принимать значение , но ему невозможно задать значение . В коде, допускающем значения NULL, эту концепцию можно представить вызывающим объектам более четко с помощью System.Diagnostics.CodeAnalysis.DisallowNullAttribute.

В контексте, допускающем значения NULL, метод доступа может возвращать значение по умолчанию, равное . Компилятор предупреждает, что перед доступом необходимо проверить это значение. Более того, он предупреждает вызывающие объекты о том, что это может быть , им не следует явно задавать его равным . Атрибут также задает предварительное условие. Он не влияет на метод доступа . Атрибут используется при отслеживании следующих моментов.

  1. Переменная может принимать значение в основных сценариях, часто при первом создании экземпляра.
  2. Переменной не следует явно задавать значение .

Эти ситуации распространены в коде, который изначально игнорировал допустимость значений NULL. Может быть так, что свойства объекта задаются в двух отдельных операциях инициализации. Может быть так, что некоторые свойства задаются только после завершения какой-либо асинхронной операции.

Атрибуты и позволяют указать, что предусловия для переменных могут не соответствовать заметкам, допускающим значение NULL, для этих переменных. Они предоставляют более подробные сведения о характеристиках API. Эта информация помогает вызывающим объектам правильно использовать API. Помните, что для указания предусловий используются следующие атрибуты.

  • AllowNull. Аргумент, не допускающий значение NULL, может принимать значение NULL.
  • DisallowNull. Аргумент, допускающий значение NULL, никогда не должен принимать значение NULL.

Переименование нескольких файлов из командной строки

Если вам нужно больше возможностей вы можете использовать rename или ren команду в окне командной строки для одного или нескольких файлов.

Команда принимает подстановочные символы , такие как * и? для согласования нескольких файлов, которые могут быть полезны , если вы только хотите переименовать определенный набор файлов в папке .

Самый быстрый способ открыть окно командной строки в нужном место это сначала нужно открыть папку в File Explorer. В меню «Файл» выберите пункт «Открыть командную строку», а затем выберите пункт «Открыть командную строку».

Чтобы переименовать один файл, вы можете использовать следующий синтаксис команды:

ren «current_» «new_»

Эти кавычки необходимы, если ваши имена файлов содержат пробелы. Если пробелов нет то вы не нуждаетесь в кавычках. Так, например, переименовать файлы с «WordFile (1) .docx» в «файл (01) .docx»используем следующую команду:

ren «wordfile (1).docx» «my word file (01).docx»

Поскольку ren команда может использоваться и для изменения расширения файла, вы можете также использовать его для изменения расширений нескольких файлов одновременно. Скажем, например, у вас был выбор .txt файлов которые вы хотели , чтобы они превратились в .html файлы. Вы можете использовать следующую команду вместе с шаблоном подстановки звёздочкой * :

Постусловия: MaybeNull и NotNull

Предположим, у вас есть метод со следующей сигнатурой.

Вероятно, вы написали такой метод для возвращения значения в случае, если искомое имя не найдено. четко указывает, что запись не найдена. В этом примере вы, вероятно, измените тип возвращаемого значения с на . Объявление возвращаемого значения как ссылочного типа, допускающего значение NULL, четко указывает намерение этого API:

По причинам, описанным в разделе , этот метод может не создавать статический анализ, соответствующий API. У вас может быть универсальный метод, который действует по аналогичному шаблону.

Если искомый элемент не найден, метод возвращает . Можно уточнить, что метод возвращает значение , если элемент не найден, добавив заметку к возвращаемому значению метода:

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

Можно также указать, что возвращаемое значение или аргумент не равны NULL, даже если используется ссылочный тип, допускающий значение NULL. Следующий метод является вспомогательным и выдает исключение, если первым аргументом является .

Эту подпрограмму можно вызвать следующим образом.

После включения ссылочных типов, допускающих значения NULL, необходимо убедиться, что предыдущий код компилируется без вывода предупреждений. Когда метод возвращает значение, параметр гарантированно не будет равен NULL. Однако можно вызвать с пустой ссылкой. Можно сделать ссылочным типом, допускающим значение NULL, и добавить постусловие в объявление параметра.

В предыдущем коде показано четкое выражение имеющегося контракта. Вызывающие объекты могут передавать переменную со значением , но аргумент гарантированно не будет равен NULL, если метод возвращает значение без выдачи исключений.

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

  • MaybeNull. Возвращаемое значение, не допускающее значение NULL, может быть равно NULL.
  • NotNull. Возвращаемое значение, допускающее значение NULL, никогда не будет равно NULL.

$null.Count

Если вы попытаетесь получить доступ к свойству по значению , это свойство также будет . Свойство является исключением из этого правила.

Если у вас есть значение , то равняется . Это специальное свойство добавляется PowerShell.

Count

Почти у всех объектов в PowerShell есть свойство Count. Одним из примечательных исключений является в Windows PowerShell 5.1 (что было исправлено в PowerShell 6.0). У него нет свойства Count, поэтому при попытке его использования вы получаете значение . Я вспомнил это к тому, чтобы вы не пытались использовать вместо проверки .

Выполнение этого примера в Windows PowerShell 5.1 и PowerShell 6.0 дает разные результаты.

11 ответов

Лучший ответ

Вы можете использовать статический метод :

537

ДМИТРИЙ МАЛИКОВ
6 Мар 2014 в 08:00

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

Steve Friedl
11 Июл 2019 в 22:36

1

Steve Friedl
11 Июл 2019 в 22:36

Другой способ добиться этого с помощью чистого PowerShell — это сделать что-то вроде этого:

Это успешно оценивается для нуля, пустой строки и пробелов. Я форматирую переданное значение в пустую строку для обработки null (иначе null вызовет ошибку при вызове Trim). Затем просто оцените равенство с пустой строкой. Я думаю, что по-прежнему предпочитаю IsNullOrWhiteSpace, но если вы ищете другой способ сделать это, это сработает.

В порыве скуки я поигрался с этим и сделал его короче (хотя и более загадочным):

Или

В зависимости от того, что вы пытаетесь сделать.

2

Peter Mortensen
24 Дек 2018 в 23:51

5

Skatterbrainz
5 Мар 2018 в 02:45

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

6

mhenry1384
30 Янв 2017 в 22:00

PowerShell 2.0 заменяет :

(» \ S » = любой непробельный символ)

Производительность очень близка:

8

Nikolay Polyagoshko
21 Май 2019 в 12:39

Лично я не принимаю пробел ($ STR3) как «непустой».

Когда в параметр передается переменная, содержащая только пробелы, часто возникает ошибка, когда значение параметра не может быть ‘$ null’, вместо того, чтобы говорить, что это не может быть пробел, некоторые команды удаления могут удалить корневую папку вместо подпапка, если имя подпапки — это «пробел», во многих случаях это причина не принимать строку, содержащую пробелы.

Я считаю, что это лучший способ добиться этого:

Пустой

Пустой

Пустой!! :-)

Не пустой

14

Nico van der Stok
18 Мар 2016 в 19:26

Если это параметр функции, вы можете проверить его с помощью , как вы можете видеть в этом примере:

24

Rubanov
30 Мар 2015 в 12:50

В дополнение к для проверки на null или пустоту вы можете явно преобразовать строку в логическое значение или в логических выражениях:

Выход:

47

Roman Kuzmin
6 Дек 2012 в 08:30

Вы, ребята, слишком усложняете задачу. PowerShell справляется с этим довольно элегантно, например:

664

anon
18 Сен 2015 в 21:44

Расширение ответа Кейта Хилла (для учета пробелов):

Это возвращает «Пусто» для значений NULL, пустых строк и строк с пробелами и «Не пусто» для всего остального.

Zodman
5 Авг 2020 в 08:45

Что такое PowerShell и чем он хорош

Пользователи UNIX и Linux, а с какого-то мoмента и macOS привыкли к тому, что под рукой всегда есть Bash — немного старомодное, но универсальное и мощное средство, при помощи которого всего парой строк можно творить удивительные вещи. Прописываешь новый скрипт в cron — и готово, он уже крутится на твоем компьютере или на сервере и незаметно делает что-нибудь полезное.

Возвращаясь в Windows (а без этого иногда никак), понимаешь, что скрипты .bat хоть и хороши, но спасают не всегда: очень уж ограниченны их возможности. И если ты до сих пор считал, что PowerShell — это неведомая штуковина, ради которой нужно что-то там поднимaть и настраивать, то не спеши с выводами — он, если разобраться, совсем неплох.

Windows PowerShell — это расширяемое средство автоматизации с открытыми исходниками, которое состоит из оболочки (командной строки) и скриптового языка. Впервые он был показан в 2003 году (тогда он назывался Monad). PowerShell 2.0 вышел в составе Windows 7 и Windows Server 2008 R2 и с тех пор присутствует в Windows в качестве стандартного компонента. Его даже включили в Windows XP SP3. PowerShell построен на основе .NET Framework и интегрирован с ним. PowerShell может обращаться к COM, WMI и ADSI, а также, конечно же, исполняет консольные команды.

В общем, «пошик» имеет крепкие связи с продуктами Microsoft, будь то Active Directory или почтовый сервер Exchange. Это позволяет без подключения к оснастке сервера обращаться к ним через консоль и отдaвать команды.

Если раньше ты не интересовался PowerShell, то, скорее всего, у тебя стоит вторая версия. Я рекомендую обновиться как минимум до третьей — она содержит куда больше возможностей и полезных фишек. Если не вдаваться в подробности, то в PowerShell 2.0 входит около десятка модулей и примерно 350 команд, а в PowerShell 3.0 уже около 2300 командлетов из более чем 70 модулей. «Хакер» также писал о том, чем отличается самый новый PowerShell пятой версии из Windows 10.

CompareTo — сравнение двух строк

Вызывается он = .CompareTo()

Результат данного метода 0 — тогда строки совпадают. Могут ещё быть -1 и 1.

-1 означает, что строка 1 меньше строки 2.

1 означет, что строка 1 больше строки 2

Например результатом данного выражения:

Delphi/Pascal

(«Hello World!»).CompareTo(«Hello»);

1 («Hello World!»).CompareTo(«Hello»);

будет 1, а выражения

Delphi/Pascal

(«Hello World!»).CompareTo(«hello world!»);

1 («Hello World!»).CompareTo(«hello world!»);

будет -1.

Что бы сравнить две строки без учёта регистра, то надо воспользоваться методом .NET:

::Compare(, , )

Сравним им строчки «Hello World!» и «hello world!»

PowerShell

::Compare(«Hello World!»,»hello world!»,$True)

1 stringCompare(«Hello World!»,»hello world!»,$True)

Результатом будет 0, то есть две строки равны.

Как временно исправить проблему с файлами?

Легкое Исправление

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

C:\User\guymc\Documents\My

Понятно, кто в этом случае виновник. Найдите файл в проводнике Windows или в проводнике, как он называется в Windows 10, нажмите один раз на него, нажмите F2, чтобы переименовать его, и измените это глупое имя файла на более разумное. Задача решена.

Менее простые исправления

Не всегда легко решить эту проблему. Иногда вы не можете изменить имена файлов или каталогов по любой причине.

Следующие решения помогут вам. Их несложно сделать.

Перемещение, удаление или копирование файлов или каталогов с помощью PowerShell Иногда вы получаете сообщение об ошибке при попытке переместить, удалить или скопировать каталоги, где количество символов для пути к файлу превышает 260.

Обратите внимание, что слова каталог и папка являются взаимозаменяемыми. Мы будем использовать «каталог» в будущем

Следующие командлеты PowerShell также можно использовать для файлов.

Возможно, путь к файлу выглядит примерно так:

C:\Users\guymc\Documents\This\Is\Exactly\The\Precise\Directory\Path\That\I\Need\To\Have\To\Keep\My\Files\Sorted\In\A\Manner\That\Makes\Sense\To\Me\So\Lets\Pretend\This\Is\An\Actual\Filepath\That\You\Might\Also\Have\On\Your\Windows\Computer\And\Not\Over\Think\It\

Этот путь к файлу составляет 280 символов. Поэтому мы не можем скопировать каталог оттуда куда-либо еще с помощью обычного метода копирования-вставки. Мы получаем ошибку Destination Path Too Long.

Давайте предположим, что по какой-то причине мы не можем переименовать каталоги, в которые вложен файл. Что мы делаем?

Когда откроется PowerShell, вы окажетесь в корне своего пользовательского каталога. Продолжайте, предполагая, что C:\Users\guymc — ваш пользовательский каталог.

Каталог с именем This находится в каталоге Documents. Чтобы перейти в каталог Documents, мы используем команду cd Documents.

Вы увидите быстрое изменение текущего каталога на C:\Users\guymc\Documents. Это хорошо. Мы работаем ближе к каталогам, которые облегчат жизнь.

Копирование каталога с использованием Copy-Item

Мы хотим скопировать каталог This и его содержимое в ThatNewFolder. Давайте используем команду PowerShell Copy-Item с параметрами -Destination и -Recurse.

-Destination сообщает PowerShell, где мы хотим, чтобы копия находилась. -Recurse говорит PowerShell скопировать все элементы внутри к месту назначения. Копирование оставляет оригиналы там, где они есть, и делает все новые в месте назначения.

Copy-Item This -Destination ThatNewFolder -Recurse

Переместить каталог с помощью Move-Item

Допустим, мы хотим переместить каталог This, а также все каталоги и файлы в нем, в ThatNewFolder. Перемещение не оставляет оригинал на месте.

Мы можем использовать команду PowerShell Move-Item с параметрами -Path и -Destination. -Path определяет элемент, который мы хотим переместить, и -Destination сообщает PowerShell, где мы хотим его получить.

Команда поместит это в ThatNewFolder. Он также будет перемещать все, что находится внутри этого каталога. Move-Item может использоваться для перемещения файлов или каталогов, и он работает независимо от пути к файлу или длины имени файла.

Move-Item -Path This -Destination ThatNewFolder

Чтобы убедиться, что это работает, используйте команду cd ThatNewFolder, чтобы войти в ThatNewFolder. Затем используйте команду dir для вывода списка каталогов в ThatNewFolder. Вы увидите, что этот каталог находится там.

Удалить каталог с помощью Remove-Item

Если мы хотим удалить этот каталог и все в нем, мы используем команду Remove-Item.

Командлет Remove-Item обладает некоторой встроенной безопасностью, которая затрудняет удаление каталога с содержимым внутри него. В нашем примере мы знаем, что хотим удалить все, поэтому мы будем использовать параметры -Recurse, чтобы заставить его удалять все внутри, и -Force, чтобы он делал это, не спрашивая нас, уверены ли мы в каждом элементе внутри.

Имейте в виду! Восстановить что-либо удаленное таким образом было бы чрезвычайно сложно.

Remove-Item This -Recurse -Force

Вы можете снова использовать команду dir, чтобы убедиться, что она пропала.

Вот и все

Инициализация значения $null

У меня выработалась привычка инициализировать все переменные перед их использованием. В других языках это обязательно. В начале функции или цикла foreach я определяю все используемые значения.

Вот сценарий, который я советую вам внимательно изучить. Это пример ошибки, которую я однажды выявлял.

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

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

Устранить проблему мне удалось после того, как я задал для прямо в цикле foreach.

Проблемы с областью действия

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

Неинициализированная переменная в функции не имеет значения , если ей присвоено значение в родительской области.
Родительской областью может быть другая функция, которая вызывает эту функцию и использует такие же имена переменных.

Если взять тот же пример и удалить из него цикл, то код будет таким:

Если вызов возвращает исключение, тогда проверка на соответствие найдет в . Инициализация значения внутри функции устраняет эту ошибку.

Именовать переменные сложно, и разработчики часто используют одинаковые имена переменных в разных функциях. Например, я постоянно использую , и . Из-за этого значения из других областей могут легко появиться в тех местах, где их не должно быть.

2 ответа

Лучший ответ

  1. Нет вывода на печать вы записывали это в коллекцию . все, что находится в строке, отправляется в выходной поток … и вы все это записывали.

  2. Сравнение не удалось, потому что ваше регулярное выражение оставило в конце вашего . Я не могу понять, как исправить регулярное выражение, поэтому просто использовал для него . после этого все заработало.

    Однако вы использовали слишком сложный каскад ПЧ. Я перешел на использование для более простого теста.

  3. Отправка данных из в переменную Все, что отправляется в выходной поток, может быть назначено . В этом случае настраиваемый объект был отправлен в выходной поток … и PoSh собрал весь этот вывод, удерживал его до завершения цикла, а затем вставил объекты в слева от {{ Х4 } } .

Вот несколько другой способ получить информацию.

Что-то не так с вашим регулярным выражением — оно включает конец строки . Я не смог это исправить, поэтому просто использовал .

Ваш каскад был слишком запутанным, поэтому я упростил его, чтобы проверить список исключенных аккаунтов.

Если для установлено значение 1, коллекция содержит следующее:

AccountName Time
----------- ----
SYSTEM      2019-02-10 1:11:52 AM

2

Ansgar Wiechers
10 Фев 2019 в 10:17

Вы записываете все в переменную , поэтому в консоль ничего не выводится.
— пустой массив, я не вижу смысла использовать здесь массив. К тому же сравнение настолько длинное, что трудно найти недостаток. Вы можете сделать намного проще, как я покажу через секунду. Я не знаю, есть ли имя, но он записывает весь вывод в переменную

Если вы это сделаете, вы должны обратить внимание, что хранится только один тип объекта. В вашем случае вы сохраняете пару строк, а затем .

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

vrdse
10 Фев 2019 в 15:45

Пустое значение NULL

Существует один особый тип , который отличается от остальных. Я буду называть его пустым значением , тогда как фактически это System.Management.Automation.Internal.AutomationNull. Такое пустое значение вы получаете в результате выполнения функции или блока скрипта, которые не возвращают ничего (возвращают void).

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

Можно создать массив с одним значением , при этом его свойство будет равно . Но если поместить пустой результат в массив, он не будет считаться элементом, а Count будет иметь значение .

Если пустое значение вы обрабатываете как коллекцию, она будет считаться пустой.

Если передать пустое значение в параметр функции, который не является строго типизированным, PowerShell по умолчанию приводит значение Nothing к значению . Это означает, что внутри функции значение будет обрабатываться как вместо типа System.Management.Automation.Internal.AutomationNull.

Pipeline

Различия особенно заметны при работе с конвейером. Вы можете передать в него значение , но не пустое значение .

В зависимости от кода следует учитывать в логике.

В любом случае сначала выполните проверку на соответствие :

  • В конвейере отфильтруйте значение NULL().
  • Задайте его обработку с помощью функции конвейера.

Создание сценария с использованием интегрированной среды сценариев (ISE)

Кроме того, вы можете использовать консоль PowerShell ISE для написания сценариев в Windows 10.

Интегрированная среда сценариев — сложный инструмент, но вы можете начать, используя следующие шаги:

  1. Откройте Пуск.
  2. Найдите Windows PowerShell ISE, щелкните правой кнопкой мыши и выберите параметр «Запуск от имени администратора».
  3. Среда запустится с пустым файлом .ps1, где вы можете создать или вставить скрипт, который хотите запустить. Например: Write-Host «Congratulations! Your first script executed successfully»
  4. Нажмите меню Файл.
  5. Нажмите «Сохранить».
  6. Введите имя для сценария. Например, first_
  7. Нажмите кнопку Сохранить.

Перенаправление вывода в $null

Все вышесказанное касалось значений , но тема не будет раскрыта, если не объяснить, как перенаправлять выходные данные в . Бывают команды, выходные данные или объекты которых нужно опустить. Это можно сделать, перенаправив выходные данные в .

Назначение в $null

Результатам команды можно назначить значение , что будет аналогично использованию .

Поскольку является постоянным значением, перезаписать его нельзя. Мне не нравится такая реализация в коде, но этот способ часто работает быстрее, чем .

Перенаправление в $null

Можно также использовать оператор перенаправления для отправки выходных данных в .

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

Вывод

При работе со списком довольно часто приходится проверять, пуст ли список или нет. Предположим, мы создали веб-приложение с использованием python и выполняем некоторые операции над этим списком. И мы развернули это веб — приложение. Теперь пользователь использует ваше веб-приложение, и внезапно ваше веб-приложение выходит из строя. Сбой произошел из-за того, что вы выполняли какие-то операции с пустым списком. Таким образом, в python всегда лучше проверить, есть ли список или нет.

Попробуйте запустить программы на вашей стороне и дайте нам знать, если у вас есть какие-либо вопросы.

Счастливого кодирования!

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: