Разное

Работа с датами powershell: Как поменять в Powershell текущее время с Set-TimeZone и Set-Date

Содержание

Как поменять в Powershell текущее время с Set-TimeZone и Set-Date

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


Для того что бы узнать текущее время можно выполнить эту команду:



Get-Date


Что бы узнать часовой пояс:



Get-TimeZone



Учитывая то, что часовых поясов много мы можем просмотреть все доступные пояса следующим способом:



Get-TimeZone -ListAvailable


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



Get-TimeZone -ListAvailable |where DisplayName -Like "*Mos*"


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



Set-TimeZone -Id "Russian Standard Time"



Для изменения даты и времени я бы советовал использовать вариант, который рассматривался в стать по работе с датой в Powershell. Мы сначала должны получить нужную дату, а затем установить. Например сегодня 24 августа 2019 года и время 0:01, я устанавливаю эту дату таким образом:



#Дата сегодня
$date = Get-Date -Day 24 -Month 8 -Year 2019 -Hour 00 -Minute 01
#Установка даты и времени
Set-Date $date


Можно установить дату со смещением от текущего времени. То есть если у вас время спешит на 2 часа вперед, то сделайте следующее:



#Вычитаем 2 часа из текущей даты
$date = (Get-Date).AddHours(-2)
#Устанавливаем новую дату и время
Set-Date $date


Другие примеры с добавлением и убавлением от даты:



# Смещение на два месяца назад
$date = (Get-Date).AddMonths(-2)
# Смещение на 4 минуты вперед
$date = (Get-Date).AddMinutes(4)
# Смещение на два года вперед
$date = (Get-Date).AddYears(2)
# Смещение на 300 секунд вперед
$date = (Get-Date).AddSeconds(300)


Мы можем установить дату и таким образом:



Set-Date "23 августа 2019 г. 0:07:53"


Но я бы не рекомендовал, так как ошибка в точке или букве может обернуться не так как вы хотели.

Теги:

#powershell

Сортировка в Powershell Sort-Object | FixMyPC

Для сортировки в Powershell есть командлет Sort-Object. Мы можем отсортировать любой вывод команд, в том числе массивы, хэш таблицы и по датам. Каждый вариант мы рассмотрим на примерах.


По умолчанию командлет сортирует по возрастанию (ASC). На примере ниже я получил данные по отклику процессора:



Get-Process | Sort-Object -Property CPU



Ключ Property допускает использование нескольких значений.


Если нам нужно выполнить сортировку по убыванию (DESC), то для этого есть следующий ключ:



Get-Service | Sort-Object -Descending -Property "Name"



Если у нас не указан ключ Descending, то у нас будет такая последовательность вывода: 


  1. Числа
  2. Буквы английского алфавита
  3. Буквы русского алфавита

 


Сортировка массивов и дат в Powershell Sort-Object


На самом деле любой объект сортируется аналогично предыдущим примерам. Если мы собираемся выполнить в Powershell сортировку по дате нужно убедиться, что нужное свойство имеет формат Datetime.



Get-ChildItem -File | Get-Member -MemberType "Property"
Get-ChildItem -File | Sort-Object -Property "LastWriteTime"



Бывает так, что дата формата INT (численный) или STR (строковый) и если вы не хотите сортировать как числа или строки, то их нужно преобразовать. Для примера так я отсортирую по типу данных datetime преобразовав число:



Get-ADComputer -Filter * -Properties lastLogon | Sort-Object {Get-Date $_.lastLogon}


Рекомендую почитать другие примеры работы с датой в Powershell.




Пример с сортировкой массива:



$a = 'z','s','f'
$a | Sort-Object -Descending


Хэш таблцицы сортируются так же.


 


Дополнительные параметры сортировки в Powershell


Хоть это и мало относится к сортировке, то у нас есть возможность получить уникальные значения в выводе:



Get-Service | Sort-Object -Unique Status



Для сортировки с учетом регистра букв есть ключ CaseSensitive, но он похоже не работает ( как минимум в PS 5.1 ). 


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



Get-Help Sort-Object -Examples


Если нужно увидеть другие ключи:



Get-Command Sort-Object -Syntax


 

Теги:

#powershell

PowerShell — Дата и Время — saw-friendship

DateTime: The truth is out there…

Так, у меня есть 30 дней для оплаты штрафа. А какое сегодня число? Ой, а месяц-то какой? Кажется февраль… А год не високосный ли?

Да, наплевать! Есть же (Get-Date).AddDays(30) !!
Далее небольшая история и много примеров работы с классом [DateTime], которые вам обязательно пригодятся, раз вы сюда попали

Когда я только начинал изучать PowerShell, я увидел много интересных и непонятных вещей, но именно класс [DateTime] был самым непонятным, поэтому я долго пытался обходить его стороной. Наверное, это связано с тем, что для написания PowerShell скриптов какое-то время совсем необязательно знать что такое методы и функции, но [DateTime] просто заставляет в это погрузиться и оказывается, все не так сложно…

Языки программирования, которые я поверхностно изучал в институте, вероятно, позволяли пользоваться какими-то методами, создавать классы и т.д., но, вероятно, для этого нужно было написать очень много строк кода, и я не представлял, что когда-нибудь я смогу создавать небольшие программы без всяких компиляторов, студий и т.д. так просто, что даже для простых задач, выполняемых мышкой, стало проще написать скрипт, чем действительно делать их мышкой.
Я думаю, что любую сущность надо прочувствовать. Я написал уже несколько десятков скриптов для ActiveDirectory, прежде чем смог сказать, что я знаю, что такое ActiveDirectory 🙂
В книгах и статьях можно найти разные объяснения про объекты, их свойства и методы. Что-то вроде следующего:
Есть дом — это объект, у него есть длина, ширина, высота — это свойства. У него есть и метод — звонок, нажми на звонок, и из дома вылетит…
Как-то не складно…
Так вот чтобы почувствовать что PowerShell — это ООП, почувствовать его мощь и попробовать понять что это такое и зачем это нужно в скриптовом языке, давайте обратимся за помощью к классу [DateTime]
В PowerShell есть много типов данных, проверить тип данных какого-то конкретного экземпляра можно с помощью метода GetType. Создадим переменную $Date и присвоим ей значение — текущую дату:

$Date = Get-Date

Убедимся что переменная $Date теперь представляет собой экземпляр класса [DateTime]

PS> $Date.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DateTime                                 System.ValueType


PS>

Свойства:

Что бы просмотреть свойства объекта, можно передать его по конвейеру в командлет select

PS> $Date | select *


DisplayHint : DateTime
DateTime    : 17 июля 2017 г. 17:06:47
Date        : 17.07.2017 0:00:00
Day         : 17
DayOfWeek   : Monday
DayOfYear   : 198
Hour        : 17
Kind        : Local
Millisecond : 78
Minute      : 6
Month       : 7
Second      : 47
Ticks       : 636359080070781099
TimeOfDay   : 17:06:47.0781099
Year        : 2017



PS>

Теперь мы поняли, что то, что мы видим на выходе командлета Get-Date, это просто удобное представление времени, но на самом деле это не строка, а объект, у которого есть свойства и к этим свойствам можно обратиться через точку. Например:

PS> $Date.Date

17 июля 2017 г. 0:00:00


PS> $Date.DayOfWeek
Monday
PS>
PS>

Методы:

$Date | Get-Member

С помощью Get-Member (чаще я использую алиас gm), мы видим методы, применяемые к классам. Метод — это функция, которая может принимать на вход аргументы. Если сравнить это со свойствами, которые показаны выше, то можно заметить что свойство DayOfWeek не может принимать никакие аргументы, они здесь не нужны, т.к. это свойство просто выводит день недели. Методы отличаются от свойств тем, что они выполняют какие-то действия.

В данном случае у нас класс [DateTime], посмотрим его методы через Get-Member (результат довольно большой, показывать не буду, выполняйте сами). Сейчас нам нужны только методы, поэтому уточним запрос:

$Date | Get-Member -MemberType Method

Теперь мы видим только методы. Выберем какой-нибудь из них, например AddDays.
Из названия метода AddDays понятно, что можно «добавить день».
Аргументы для методов передаются в скобках и называются страшным словом «перегрузка», но поскольку методы не имеют именованных параметров, важно соблюдать порядок, в котором аргументы передаются.

Итак мы решили воспользоваться методом AddDays, а когда смотрели Get-Member, то в Definition видели «double value» (число с плавающей запятой, см. типы данных). Теперь мы знаем что через точку можем обратиться к свойствам и методам, но методам можно передавать аргументы в скобках. Значит так и напишем: Экземпляр класса (объект), точка, метод, аргумент в скобках. Аргументом у нас будет число «2»,

Попробуем:

PS> $Date.AddDays(2)

19 июля 2017 г. 17:06:47


PS>

Теперь нецелое отрицательное

PS> $Date.AddDays(-1.5)

16 июля 2017 г. 5:06:47


PS>

Отлично, мы отняли полтора дня!

Это можно использовать и в командлетах:

PS# Get-EventLog -LogName Security -After (Get-Date).AddDays(-1) -Newest 3

   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
     541 июл 17 18:05  SuccessA... Microsoft-Windows...         4801 Разблокирована рабочая станция....
     540 июл 17 17:28  SuccessA... Microsoft-Windows...         4800 Заблокирована рабочая станция....
     539 июл 17 16:12  SuccessA... Microsoft-Windows...         4801 Разблокирована рабочая станция....


PS#
PS# ls $env:USERPROFILE\Desktop | ? {$_.LastWriteTime -ge (Get-Date).AddDays(-1)}


    Каталог: C:\Users\User\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       17.07.2017      1:20                script2.1
-a----       16.07.2017     23:24           3234 script1.ps1
-a----       16.07.2017     23:16           1660 readme.txt


PS#

Во многих командлетах на вход принимается именно дата, причем дата может быть указана и в виде текста (правда лучше так не делать).
Убедимся, напишем простую функцию «When», принимающую на вход один аргумент (именованный параметр «Date»):

PS> Function When {
>> param(
>> [Parameter(Mandatory=$true)][DateTime]$Date
>> )
>>
>> $Date
>> }
PS>
PS>
PS>
PS>
PS> When -Date (Get-Date).AddDays(-1)

16 июля 2017 г. 18:56:34


PS>
PS>
PS> When -Date '06.16.2017 18:56:34'

16 июня 2017 г. 18:56:34


PS>

Несколько примеров создания объекта [DateTime]

В этом примере в целом все нормально, но если не указать какой-либо из параметров, то аргумент для параметра будет взят из текущей даты

Get-Date -Year 2017 -Month 12 -Day 06 -Hour 18 -Minute 55 -Second 0

Или тоже самое, но через сплаттинг

$param = @{
'Year'=2017;
'Month'=12;
'Day'=6;
'Hour'=18;
'Minute'=55;
'Second'=0
}
Get-Date @param

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

New-Object DateTime (2017, 12, 06, 18, 55, 00)

Или так

[DateTime]::new(2017, 12, 06, 18, 55, 00)

Преобразование типа из string в datetime, (плохой метод)

[DateTime]'2017.12.06 18:55:00'

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

PS> [datetime]’12.07.2017 14:55:00′

7 декабря 2017 г. 14:55:00

PS>

Мы получили 7-е декабря! Это не по-русски 🙂 Поэтому предлагаю самый правильный вариант получения даты из string, он больше всего подходит для парсинга логов, потому что он позволяет не просто отдать строку на неконтролируемое преобразование, а задать шаблон по которому преобразование производить

[DateTime]::ParseExact('2017.12.06 18:55:00','yyyy.MM.dd HH:mm:ss',$null)

В русских форматах нам достаточно двух аргументов, третий тоже необходимо указать, но тут он равен $null (если работать в одной локальной системе), но если у нас разные системы на разных языках, мы можем заставить PowerShell выводить или принимать дату на любом языке. Нам придется чуть-чуть углубиться в еще один класс [System.Globalization.CultureInfo] или сокращенно [CultureInfo]
Третий аргумент отвечает за языковые особенности формата дат, а его тип «CultureInfo»

Текущая культура

PS> [CultureInfo]::CurrentCulture

LCID             Name             DisplayName
----             ----             -----------
1049             ru-RU            Русский (Россия)


PS>

Американская культура

PS> [CultureInfo]::GetCultureInfo('en-US')

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            Английский (США)                                                                                                                                         


PS>

Выведем дату в американском формате

PS> (Get-Date).ToString([CultureInfo]::GetCultureInfo('en-US'))
7/18/2017 3:27:35 PM
PS>

А теперь преобразуем строку с полученной выше датой обратно в объект

PS> $str = (Get-Date).ToString([cultureinfo]::GetCultureInfo('en-US'))
PS>
PS> $str
7/18/2017 3:30:40 PM
PS>
PS>
PS> [datetime]::ParseExact($str, 'M/d/yyyy h:m:s tt', [cultureinfo]::GetCultureInfo('en-US'))

18 июля 2017 г. 15:30:40


PS>

Сравнение:

В скриптах нам часто требуется сравнивать две даты между собой или сортировать по дате. PowerShell позволяет сравнивать даты как будто это числа (хотя так оно, конечно, и есть).

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

Убедимся:

PS> (Get-Date) -lt (Get-Date).AddSeconds(1)
True
PS>
PS>
PS> (Get-Date) -gt (Get-Date).AddSeconds(1)
False
PS>
PS>

Сортировка:

PS> 1..3 | % {[DateTime]::new(2017, 12, 06, 18, 55, $_)} | Sort-Object -Descending

6 декабря 2017 г. 18:55:03
6 декабря 2017 г. 18:55:02
6 декабря 2017 г. 18:55:01


PS>

Вычитание дат:

В жизни мы иногда задаемся вопросом: «Сколько же с тех пор времени прошло?», и даже не верится, что в PowerShell такую операцию можно совершить с помощью знака минус, но как бы это ни казалось чудом, это возможно 🙂
Результатом вычитания двух дат будет объект класса [TimeSpan] (следует понимать как временной интервал)

PS> (Get-Date) - (Get-Date).AddDays(-3)


Days              : 3
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 0
Ticks             : 2592000000000
TotalDays         : 3
TotalHours        : 72
TotalMinutes      : 4320
TotalSeconds      : 259200
TotalMilliseconds : 259200000



PS>

Кстати убедимся, что это действительно [TimeSpan]

PS> $TimeSpan = (Get-Date) - (Get-Date).AddDays(-3)
PS> $TimeSpan.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     TimeSpan                                 System.ValueType


PS>

А теперь самое интересное: две даты конечно сложить нельзя, но к дате можно прибавить TimeSpan

PS> (Get-Date) + $TimeSpan

21 июля 2017 г. 1:15:33


PS>

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

Создать объект класса TimeSpan можно несколькими способами, вот 3 варианта на выбор:

[TimeSpan]::new(0,1,0,0,0)
New-Object TimeSpan (0,1,0,0,0)
[TimeSpan]::FromHours(1)

Как видим, результат один и тот же:

PS> $Date + [TimeSpan]::new(0,1,0,0,0)

17 июля 2017 г. 18:06:47


PS>
PS> $Date + (New-Object TimeSpan (0,1,0,0,0) )

17 июля 2017 г. 18:06:47


PS>
PS> $Date + [TimeSpan]::FromHours(1)

17 июля 2017 г. 18:06:47


PS>

Форматирование

Нам потребуется метод ToString

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

PS> $TimeSpan = [TimeSpan]::new(0,3,0,0,0)
PS> $TimeSpan.ToString()
03:00:00
PS>
PS>
PS> $TimeSpan = [TimeSpan]::new(1,3,0,0,0)
PS> $TimeSpan.ToString()
1.03:00:00
PS>

Видим неприятный момент, если TimeSpan меньше одного дня, то день вообще не попадает в вывод, у нас есть возможность указать свой формат, но лучше заранее знать разрядность количества дней. Для этого мы должны передать методу ToString аргумент в виде строки (примеры тут):

PS> $TimeSpan.ToString('dd\.hh\:mm\:ss')
01.03:00:00
PS>
PS> $TimeSpan.ToString('ddd\.hh\:mm\:ss')
001.03:00:00
PS>

Можно вставлять любые символы, но их обязательно нужно экранировать с помощью «\» (backslash)

PS> $TimeSpan.ToString('\d\:ddd\.\h\:hh\.\m\:mm\.\s\:ss')
d:001.h:03.m:00.s:00
PS>
PS>

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

Пожалуйста:

PS> (Get-Date).ToString('ddd, dd.MM.yyyy')
Вт, 18.07.2017
PS>
PS> (Get-Date).ToString('ddd, dd.MM.yyyy', [cultureinfo]::GetCultureInfo('en-US'))
Tue, 18.07.2017
PS>

Или так:

PS> (Get-Date).ToString('hh:mm, ddd, dd MMM yyyy')
03:46, Вт, 18 июл 2017
PS>
PS>
PS> (Get-Date).ToString('hh:mm tt, ddd, dd MMM yyyy', [cultureinfo]::GetCultureInfo('en-US'))
03:46 PM, Tue, 18 Jul 2017
PS>

На последок бонус)))
Метод определения дней в месяце и проверки високосного года

PS> [DateTime]::DaysInMonth(2017,07)
31
PS>
PS> [DateTime]::IsLeapYear(2016)
True
PS>

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

# ——————-
Статья написана после анализа интересов людей, пытающихся найти помощь по PowerShell в интернете. Больше всего кликов было на один из моих первых постов, который представлял собой маленький черновик по [DateTime] с примерами и особо без объяснений 🙂

Понравилось это:

Нравится Загрузка…

PowerShell — Дата и время черновик — saw-friendship

# Если у вас имеется дата в каком-либо формате и вам необходимо преобразовать ее в объект [DateTime], можно воспользоваться дотнетовским ParseExact, для этого во втором аргументе скармливаем формат, в котором записана дата

$StrTime = '20100610'
[DateTime]::ParseExact($strtime,'yyyyMMdd',$null)
>>
10 июня 2010 г. 0:00:00

# Преобразование даты в строку. Не самый изящный, но популярный вариант

'{0:yyyy MM d}' -f $(Get-Date)
>>
2016 01 21

# Еще один популярный вариант, но тоже некрасивый

[String]::Format('{0:R}',(get-date -f d))
>>
14.02.2016

# Вот так значительно лучше. Конструкция более естественная чтоли))

(Get-Date).ToString('yyyy.MM.dd-HH:mm')
>>
2016.02.14-22:25

# Создание объекта [DateTime]

New-Object DateTime(2008, 11, 18, 1, 40, 02)
>>
18 ноября 2008 г. 1:40:02

# Определить «високосность» года

[DateTime]::IsLeapYear(2016)
>>
True

# Количество дней в месяце

[DateTime]::DaysInMonth(2016,2)
>>
29

# Изменить дату создания и изменения файла на 33 года назад

ls D:\testtime.txt | % {$_.CreationTime = $_.LastWriteTime = $_.LastAccessTime = (get-date).AddYears(-33).Date}

# Изменить дату создания и изменения файла на 1701 год

ls D:\testtime.txt | % {$_.CreationTime = $_.LastWriteTime = $_.LastAccessTime = (get-date -Year 1701 -Month 1 -Day 1 -Hour 0 -Minute 0 -Second 0)}

Update:

Этот пост был написан еще когда мне самому нужен был черновик 🙂

Я написал новую, довольно развернутую статью https://sawfriendship.wordpress.com/2017/07/17/powershell-date-and-time/

Понравилось это:

Нравится Загрузка…

Работа с переменными окружения в PowerShell

Смотрите также «Полный список переменных окружения Windows».

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

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

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

Как вывести все переменные окружения в PowerShell

Чтобы показать все переменные окружения в PowerShell используйте команду:


Get-ChildItem Env:

Точно такой же результат будет получен при использовании сокращённой записи этой команды:


gci env:

Командлет Get-Item даст точно такой же результат — выведет все переменные окружения:


Get-Item Env:

Для постраничного вывода информации с возможностью пролистывания используйте следующую команду:


Get-ChildItem Env: | more

Для сохранения вывода в файл output.txt, который можно открыть в любом редакторе, например в Notepad.:


Get-ChildItem Env: > output.txt

Чтобы показать значения всех переменных в списке, отсортированным по именам переменных:


Get-ChildItem Env: | Sort Name

Как показать значение переменной окружения в PowerShell

Чтобы показать значение только одной переменной, используйте конструкцию:


gci env: | where name -contain 'ИМЯ-ПЕРЕМЕННОЙ'

К примеру, чтобы показать значение только PROCESSOR_ARCHITECTURE:


gci env: | where name -contain 'PROCESSOR_ARCHITECTURE'

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


gci env: | where name -like 'ЧАСТЬ-ИМЕНИ*'

Например, чтобы показать значения всех переменных, чьё имя начинается на «Pro»:


gci env: | where name -like 'Pro*'

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

Следующая команда выведет содержимое WINDIR:


Get-ChildItem -Path Env:windir

Эта команда также покажет значение переменной окружения WINDIR (обратите внимание на разницу в форматировании):


$env:windir

Как установить или поменять значение переменной окружения в PowerShell

Для установки новой переменной окружения используется команда вида:


$Env:<ИМЯ-ПЕРЕМЕННОЙ> = "<НОВОЕ-ЗНАЧЕНИЕ>"

Например:

Например, чтобы установить значение переменной servpath на c:/Server:


$Env:servpath = "c:/Server"

Чтобы добавить;c:\temp к значению переменной окружения Path используйте следующий синтаксис:


$Env:Path += ";c:\temp"

На Linux или MacOS в качестве разделителя используйте двоеточие (:), чтобы отделить новый путь от имеющихся путей.


$Env:PATH += ":/usr/local/temp"

Вы также можете использовать командлеты PowerShell, такие как Set-Item, Remove-Item и Copy-Item для изменения значений переменных окружения.

Пример использования командлета Set-Item для добавления ;c:\temp к значению переменной окружения Path


Set-Item -Path Env:Path -Value ($Env:Path + ";C:\Temp")

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

Как удалить переменную окружения в PowerShell

Эта команда удаляет переменную окружения USERROLE2 из текущей сессии:


Remove-Item -Path Env:USERROLE2

Эта команда удаляет переменную окружения USERROLE очищая её значение:


Clear-Item -Path Env:USERROLE

Связанные статьи:

Powershell работа с Excel на примере служб windows

Для работы с Excel в среде powershell нужно использовать COM объект.


#Создаем новый объект
$excel = New-Object -ComObject Excel.Application 

При выполнении данного командлета произойдет запуск приложения Excel в скрытом состоянии, т.е. у нас будет висеть процесс Excel, но при этом самого приложения как такового мы не увидем. Для того чтобы увидеть работу приложения нужно обратиться к его свойству Visible и установить его в TRUE т.к. по умолчанию стоит FALSE


#Режим записи видимый
$excel.Visible = $true 

Далее после того как приложение открылось нужно создать книгу воспользовавшись свойством Workbooks и методом Add().


#Создаем книгу Excel
$EWB = $excel.Workbooks.Add() 

После создания книги нужно выбрать лист с которым будем работать в данной книге. Для этого воспользуемся свойством Worksheet и методом Item()передав ему номер листа с которым будем работать.


#Выбираем первый лист книги
$EWS = $EWB.Worksheets.Item(1) 

Зададим имя нашему листу для этого используем свойство Name и присвоим ему значение нового имени листа.


#Название листа книги
$EWS.Name = 'Service' 

Так как Excel это таблица и мы работаем с ее ячейками то используем свойство Cells и метод Item() для указания с какими ячейками данного листа мы будем работать. Отсчет начинается с 1.


#Первая строка ячеек
$EWS.Cells.Item(1,1) = 'Status'
$EWS.Cells.Item(1,2) = 'Name'
$EWS.Cells.Item(1,3) = 'DisplayName' 

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


#Перебераем массив и вставляем в нужные ячейки листа
$j = 2
foreach($arr in $srv)
{
   #Если процесс запущен то зеленый иначе красный
   if($arr.Status -eq 4){
    $EWS.Cells.Item($j,1) = 'Запущен'
    $color = 10
   }else{
    $EWS.Cells.Item($j,1) = 'Остановлен'
    $color = 3
   }
   
   
   $EWS.Cells.Item($j,2) = $arr.Name
   $EWS.Cells.Item($j,3) = $arr.DisplayName
   
   $EWS.Cells.Item($j,1).Font.Bold = $true
   $EWS.Cells.Item($j,1).Font.ColorIndex = $color

   $j++
} 

После того как книга заполнена нужными данными ее необходимо сохранить. Для этого используем метод Saveas() и передаем ему путь и имя файла для сохранения.


#Сохраняем книгу
$EWB.Saveas('C:\Excel\services.xlsx') 

После этого закрываем саму книгу воспользовавшить методом Close().


#Закрываем книгу
$EWB.Close() 

После того как закрыли книгу можно завершать работу приложения Excel использую метод Quit(). Тем самым освободив память в системе.


#Закрываем приложение Excel
$excel.Quit() 

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



#Получаем список всех процессов
$srv = Get-Service

#Создаем новый объект
$excel = New-Object -ComObject Excel.Application

#Режим записи видимый
$excel.Visible = $true

#Создаем книгу Excel
$EWB = $excel.Workbooks.Add()

#Выбираем первый лист книги
$EWS = $EWB.Worksheets.Item(1)

#Название листа книги
$EWS.Name = 'Service'

#Первая строка ячеек
$EWS.Cells.Item(1,1) = 'Status'
$EWS.Cells.Item(1,2) = 'Name'
$EWS.Cells.Item(1,3) = 'DisplayName'

#Перебераем массив и вставляем в нужные ячейки листа
$j = 2
foreach($arr in $srv)
{
   #Если процесс запущен то зеленый иначе красный
   if($arr.Status -eq 4){
    $EWS.Cells.Item($j,1) = 'Запущен'
    $color = 10
   }else{
    $EWS.Cells.Item($j,1) = 'Остановлен'
    $color = 3
   }
   
   
   $EWS.Cells.Item($j,2) = $arr.Name
   $EWS.Cells.Item($j,3) = $arr.DisplayName
   
   $EWS.Cells.Item($j,1).Font.Bold = $true
   $EWS.Cells.Item($j,1).Font.ColorIndex = $color

   $j++
}

#Сохраняем книгу
$EWB.Saveas('C:\Excel\services.xlsx')

#Закрываем книгу
$EWB.Close()

#Закрываем приложение Excel
$excel.Quit()


Поддержи проект:

Командлет Get-Date

Windows PowerShell | Примеры Вычисление с использованием DateTime

Windows PowerShell Get-Date Format

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

Темы для Windows PowerShell Get-Date и DateTime

Введение в командлет Get-Date

На этой странице я изменяю свой обычный порядок работы.Я хочу начать с решения проблемы, которую представляет собой задача из реальной жизни. После демонстрации примеров использования Get-Date в действии я рекомендую вам изучить дополнительные методы и свойства для этого командлета PowerShell. В результате у вас появятся навыки для выполнения других проектов DateTime.

Сколько дней до Рождества? (или День Благодарения)

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

Здесь, в Великобритании, наши операционные системы показывают даты в формате: дд мммм гггг. В то время как в США ваш языковой стандарт отображается как мммм дд гггг. Следовательно, я был поражен тем, что PowerShell может преобразовывать как «25 декабря 2014 г.», так и «28 ноября 2014 г.» в значения даты, которые он может понимать и выполнять вычисления.

Пример 1 — Расчет дней до Рождества с использованием множества переменных

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

# PowerShell DateTime Script для отображения дней до Рождества
Clear-Host
$ DecDate = «25 декабря 2014 г.»
$ NovDate = «28 ноября 2014 г.»
$ Thanksgiving = [system.datetime] $ NovDate
$ Christmas = [system .datetime] $ DecDate
$ Today = Get-Date
$ Xmas = ($ Christmas.DayOfYear — $ Today.DayOfYear)
$ Thanks = ($ Thanksgiving.DayOfYear — $ Today.DayOfYear)
«Есть» + $ Xmas + «дней до» + $ DecDate
«Есть» + $ Спасибо + «дней до» + $ NovDate

Примечание 1: Вы можете проверить значения для $ DecDate и $ NovDate, а затем изменить последовательность дней месяца в зависимости от вашего региона.

Примечание 2: Интересно посмотреть, как PowerShell использует .Net Framework, например, он использует System.DateTime для преобразования текстовой строки в формат даты.

Примечание 3: Я все удивляюсь, как PowerShell может понимать оба формата: дд мммм гггг и мммм дд гггг.

Guy рекомендует: Бесплатная пробная версия Network Performance Monitor (NPM) v11.5

SolarWinds Network Performance Monitor поможет вам узнать, что происходит в вашей сети.Эта утилита также поможет вам в устранении неполадок; на приборной панели будет указано, является ли основная причина неисправной ссылкой, неисправным оборудованием или перегрузкой ресурсов.

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

Загрузите бесплатную пробную версию монитора производительности сети Solarwinds

Пример 2 — Производственная версия «Сколько дней до Рождества»

# PowerShell DateTime Example
«Есть» + (([system.datetime] «25 декабря 2014 г.»). DayOfYear — `
(Get-Date) .DayOfYear) +« дней до »+« 24 декабря 2014 г. »

Примечание 4: Это всего лишь одна длинная команда. Обратите внимание на то, как обратная кавычка (`) позволяет команде перейти во вторую строку. В качестве альтернативы можно разорвать линию в символе открытой скобки следующим образом:

— (
Get-Date) .DayOfYear) + «дней до» + «24 декабря 2014 года»

Примечание 5: Для этой команды требовался дополнительный набор раундов. скобки для окружения [system.datetime] «25 декабря 2014 г.»

Примечание 6: Интересно посмотреть, как PowerShell интерпретирует смесь «текстовых строк» ​​и

Powershell: Работа со строками — основы

$ name = «Джастин»
$ date = get-date
#### все двойные кавычки — переменные оцениваются
## old style concat
«привет» + $ name + «как дела?» + $ date.dayofweek
## powershell way, мой любимый
«привет, $ name, как дела, этот $ ($ date.dayofweek) »
## .net форматирование, может быть очень полезным.
«привет, {0}, как дела, это {1}» -f $ name, $ date.dayofweek
## статический метод строкового класса
[string] :: Concat («привет», $ name, «, как это ты, $ date.dayofweek)
## вот-строка — это круто!
@ »
привет $ name
как дела этот $ ($ date.dayofweek)
« @ ##### одинарные кавычки — переменные НЕ оцениваются в кавычках
‘hello’ + $ name + ‘, как дела? ‘+ $ date.dayofweek
‘ привет, $ name, как дела, $ ($ date.dayofweek) ‘
‘ привет {0}, как дела, это {1} ‘-f $ name, $ date.dayofweek
[string] :: Concat (‘ hello ‘, $ name,’, как дела? ‘, $ date.dayofweek) @ ‘
привет $ name
как дела $ ($ date.dayofweek)
‘ @

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

«привет, $ name, как дела, $ ($ date.DayOfWeek) »

Результат:

привет Джастин, как дела в эту пятницу

Мне не нужно было делать ничего особенного, чтобы заставить эту работу работать, и, как вы можете себе представить, создавая большие струны, это может быть очень полезно. Говоря о более крупных строках, давайте перейдем к Here-String, еще одной замечательной функции Powershell.

@ »
привет $ name
как дела $ ($ date.dayofweek)
« @

Чтобы начать Here-String, вы должны закончить строку с помощью @ », а чтобы закончить ее, строка должна начинаться с« @ (Спасибо, Ларри).

что угодно…. @ ”<Здесь конец строки>
содержимое здесь строки здесь….
<начало строки> @ ”что угодно… ..

Отлично подходит для создания тел электронной почты и т.п.

Одиночная цитата Vs. Двойная кавычка

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

Как работает оценка

При оценке переменных с членами нужно помнить об одном. Как вы можете видеть в коде, у нас есть две переменные, базовая строка и объект DateTime. Со строкой я просто использую встроенную переменную, и она оценивает, но с объектом DateTime мне нужно обернуть его для доступа к элементу-члену, в противном случае он оценивает только $ Date.

«$ ($ date.DayOfWeek)»
«$ date.DayOfWeek»

Вы заметите разницу в выводе,

пятница
01.07.2011 09:16:31.День недели

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

Формат строки

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

http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

“{0}” –f $ date

«{0: MM-yy}» –f $ date

Отлично подходит для построения дат для использования с именами файлов.Синтаксис

элемента формата состоит из 3 частей.

{индекс [, выравнивание] [: строка формата]}

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

«- {0,15} -» -f $ name
«- {0, -15} -» -f $ name

Круто, да?

Подробнее здесь

http://msdn.microsoft.com / en-us / library / txafckwd.aspx

Бонус — статические члены

Я настолько большой поклонник Get-Member, что должен упоминать его как можно чаще. Вы заметите, что вверху есть строка для Concat. Я бы когда-нибудь использовал это? Маловероятно, но это показывает что-то классное, Static Member.

Get-Member –inputobject «» –Static

Это даст вам Strings Static members. Мы можем использовать статические члены, например,

[Класс] :: StaticMember

[Net.Dns] :: GetHostEntry ($ компьютер)

Примечание: System.предполагается в ссылках на классы!

Надеюсь, это поможет!

Второй взнос!

42.358800
-71.124700

Нравится:

Нравится Загрузка …

Связанные

Get-Date — PowerShell — SS64.com

Get-Date — PowerShell — SS64.com

Получите текущую дату и время.

 Синтаксис
      Get-Date [[-date]  DateTime ]
         [-displayHint {Дата | Время | DateTime}]
           {[-format  string ] | [-  u  Формат  строка ]}
              [-год  int ] [-месяц  int ] [-day  int ] [-hour  int ]
                 [-минут  int ] [-second  int ] [ CommonParameters ]

ключ
   -date  DateTime 
       По умолчанию Get-Date возвращает текущую системную дату и время.Параметр -date позволяет указать
       (обычно через конвейер) конкретную дату и время.

   -displayHint  DisplayHintType 
       Отображать только дату, только время или дату и время.
       Это не влияет на извлекаемый объект DateTime.

   -format  строка 
       Отображение даты и времени в формате .NET
       как указано  Строка , представляющая спецификатор формата.
        
   -uFormat  строка 
       Отображение даты и времени в формате Unix.Ошибка заключается в том, что% V не возвращает номер недели по ISO. Обходные решения см. Ниже.
       Варианты% g,% G,% h,% k,% l,% N,% u,% U,% V,% w,% W,% X и% Z также являются нестандартными.
 
год, месяц, день, час, минута, секунда Это позволяет вам установить отдельные элементы, которые будут отображаться на месте текущей даты / времени. например вы можете установить время на 12:00

Когда вы используете -format или -uformat, PowerShell извлекает только те свойства, которые необходимы для отображения даты в указанном вами формате.В результате некоторые свойства и методы объектов DateTime могут быть недоступны.

Дата Свойства:

$ день = (дата получения). День
$ dayofweek = (дата получения) .dayofweek
$ dayofyear = (дата получения) .dayofyear
$ час = (дата получения). час
$ ms = (дата получения). миллисекунда
$ минута = (дата получения). минута
$ month = (дата получения) .month
$ second = (дата получения) .second
$ time = (дата получения) .timeofday
$ год = (дата получения).

год

Чтобы увидеть все свойства и методы объекта DateTime, введите get-date | получить член

Если вы укажете значение, превышающее количество дней в месяце, PowerShell добавит число
дней в месяц и отображает результат. Например, get-date -month 2 -day 31 отобразит «3 марта», а не «31 февраля».

Неделя года

Хотя документ get-date -uformat возвращает «формат Unix», а в Unix% V возвращает номер недели ISO, Get-Date -uformat «% V» фактически возвращает «неделю Microsoft» в году.Неделя 1 просто определяется как первые 6 дней в году и последующие недели, пронумерованные каждые 7 дней.

Почему 6 дней в первую неделю, а не 7, я понятия не имею — это означает, что любой еженедельный отчет, сделанный с использованием этих номеров недель, будет иметь ошибку 15% -20% в первую неделю года.

Стандартные номера недель ISO всегда начинаются с понедельника , а первая неделя года всегда составляет 7 дней.

Неделя 1 года — это первая неделя с не менее чем четырьмя днями этого года, поэтому первый четверг в году всегда приходится на неделю 1.

Каждая неделя ISO длится 7 дней, но иногда эти недели переходят в новый год, поэтому в приведенном выше примере , январь 2027 г., первые 3 дня будут на 53 неделе ISO предыдущего года.

В Excel функция = ISOWEEKNUM ( Дата ) вернет правильный номер недели ISO.

Вычислить истинное число недель ISO в PowerShell немного сложнее
но вот короткий сценарий для этого:

 $ checkdate = Get-Date -date " 2007-12-31 "
$ dow = [int] ($ checkdate).день недели
# если день недели до четверга (пн-ср), добавьте 3, так как четверг является критическим
# день для определения начала недели ISO. Источник [x]
if ($ dow -match "[1-3]") {$ checkdate.addDays (3)}
# Вернуть номер недели ISO
$ (Get-Culture) .Calendar.GetWeekOfYear (($ checkdate), [System.Globalization.CalendarWeekRule] :: FirstFourDayWeek, [DayOfWeek] :: Monday) 

# Метод ISOWeek.GetWeekOfYear упростит это в .NET Core 3.0 / .Net standard 2.1

Примеры

Получить текущую дату и время, но отобразить только дату:

PS C: \> get-date -DisplayHint date

Получить текущую дату и время и сохранить в переменной $ start:

PS C: \> $ start = Get-Date -format «дд-MMM-yyyy HH: mm»

Получить текущее время в часах, минутах и ​​секундах:

PS C: \> $ time_now = Get-Date -format «ЧЧ: мм: сс»
14:43:04

Получить текущую дату и время в строгом формате ISO 8601:

PS C: \> Get-Date -format s
2018-11-26T14: 43: 04

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

PS C: \> get-date -format yyyy-MM-ddTHH-mm-ss-ff
2018-11-26T14-45-02-33

Получить текущую дату и время, отобразить как общую короткую дату / время:

PS C: \> get-date -format g

Отображение дня в году:

PS C: \> (дата получения).день года

Получить день недели как целое число (0 = воскресенье, 6 = суббота):

PS C: \> [Int] $ dow = Get-Date | Выбрать объект -ExpandProperty DayOfWeek
PS C: \> $ Доу

Отображение вчерашней даты с использованием метода .AddDays:

PS C: \> (Get-Date) .AddDays (-1)

Получить конкретную дату:

PS C: \> $ mydate = Get-Date -date «2021-02-28»
или
PS C: \> «2021-02-28» | Get-Date

Отображение летнего времени и UTC:

PS C: \> $ a = дата получения
$ а.IsDaylightSavingTime ()
$ a.ToUniversalTime ()

# или отобразить в формате ISO 8601:
$ a.ToUniversalTime (). ToString (‘гггг-ММ-дд ЧЧ: мм: сс’)

Отображение даты BIOS удаленного компьютера с помощью WMI:

PS C: \> $ a = get-ciminstance win32_bios -computer SERVER64
$ a | format-list -property Name, @ {Label = «Дата BIOS»; `
Выражение = {$ _. ConvertToDateTime ($ _. ReleaseDate)}}

Обратный апостроф (`) — это символ продолжения строки

«Carpe Diem — Лови день» ~ Гораций

Связанные командлеты PowerShell:

Set-Date — установка системного времени в хост-системе.
New-Timespan — Создать объект временного диапазона.
Rename-Item — переименовать элементы, указав дату или время.
Эквивалентная команда bash: date — отображение или изменение даты.


Авторские права © 1999-2020 SS64.com
Некоторые права защищены.

Работа с переменными PowerShell — технические мысли

До сих пор в серии «Изучение PowerShell» мы запускали командлеты напрямую. Когда вы начнете писать более сложную оболочку PowerShell, вам понадобится возможность сохранять выходные данные в переменных PowerShell.Сохранение данных в переменных расширяет ваши возможности PowerShell, позволяя вам работать с выходными данными для получения мощных аналитических сведений и возможностей.

Объявление переменных PowerShell

Как обсуждалось в предыдущих уроках, PowerShell имеет дело с объектами. Переменные PowerShell — это просто именованный объект, в котором хранятся указанные вами данные объекта. Создавайте именованные объекты, используя символ $ , за которым следует имя переменной. Быстрый пример демонстрирует, насколько это просто:

Get-Process
$ процессов = Get-Process
$ процессы
 

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

Теперь, когда у нас есть эта информация, хранящаяся в $ процессах , больше нет необходимости запускать Get-Process каждый раз, когда нам нужна другая информация. Рассмотрим следующий пример:

# ----------------------------------------
# не используется переменная
Get-Process | Где-Объект {$ _.CPU -gt 5000} #find процессов, загружающих процессор
Get-Process | Sort-Object WorkingSet64 -Descending # сортировка процессов по использованию памяти
# ----------------------------------------
# используя переменную
$ процессов = Get-Process
$ процессы | Where-Object {$ _. CPU -gt 5000} #find процессы, загружающие ЦП
$ процессы | Sort-Object WorkingSet64 -Descending # сортировка процессов по использованию памяти
# ----------------------------------------
 

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

Видео

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

Общие сведения о переменных PowerShell

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

$ myNewVariable
 

Вы только что объявили новую переменную PowerShell, $ myNewVariable . Что это за переменная? Это строка? Это целое число? Логическое? В PowerShell эта новая переменная имеет потенциал , может быть или . Если бы вы загрузили его строкой, он стал бы строковым типом данных. Если присвоить ему целое число, оно станет целым числом. Загрузка его с помощью Get-Process приведет к тому, что он станет системой .Диагностика.Процесс тип объекта.

Типы данных переменных

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

# ----------------------------------------
Всего $ = 2 + 2
всего $
всего $ | Get-Member
# ----------------------------------------
$ total = '2 + 2'
всего $
$ всего | Get-Member
# ----------------------------------------
 

Если вы запустите вторую и третью строки в этом примере, вы обнаружите, что $ total содержит результат 4.Поскольку мы предоставили целочисленную операцию во второй строке, $ total становится целочисленным типом. Вы можете подтвердить это с помощью Get-Member в четвертой строке.

В шестой строке мы заключаем операцию в кавычки, образуя строку . Это изменяет тип данных, и $ total теперь имеют тип строки. Обратите внимание, что $ total теперь вместо этого содержит результат 2 + 2 . Это связано с тем, что $ total — это буквальная строка, и математические операции не выполнялись.Вы можете подтвердить это с помощью Get-Member в строке восемь.

Работа с различными типами переменных

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

# ----------------------------------------
$ num1 = 2
$ num2 = 2
$ total = $ num1 + $ num2
всего $
# ----------------------------------------
$ num1 = '2'
$ num2 = '2'
$ total = $ num1 + $ num2
всего $
# ----------------------------------------
 

Первоначально $ num1 и $ num2 загружаются с целыми числами.Когда математическая операция выполняется в строке четыре, это приводит к тому, что $ total также становятся целочисленными с результатом 4.

Во втором примере $ num1 и $ num2 загружаются строками. Когда та же операция выполняется в строке 9, это приводит к тому, что $ total также становится строкой с результатом 22! Вот почему так важно понимать, с каким типом переменной вы работаете, так как это может повлиять на результат!

Строго типизируемые переменные

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

[число] $ num1 = '2'
[число] $ num2 = '2'
$ total = $ num1 + $ num2
 

В наших предыдущих примерах, когда мы заключали числа в кавычки, он загружал их в буквальные строковые переменные. Обратите внимание, что в этом примере переменная предварительно загружается с помощью [int] . Это говорит PowerShell, что вы хотите, чтобы эта переменная имела тип int. Несмотря на то, что числа 2 заключены в кавычки, PowerShell загрузит их как целые числа, и всего $ будет равно 4.

Преобразование типов переменных

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

# возьмите переменную $ total из предыдущего примера и преобразуйте ее в строку
$ iAmAStringNow = $ total.ToString ()
 

В этом примере мы объявляем новую переменную $ iAmAStringNow и загружаем $ total.ToString () . $ total , конечно, целое число, но что такое .ToString () ? Это метод , который используется для преобразования $ total в строку. Как я узнал, что могу использовать метод ToString на $ всего ? Я использовал Get-Member, чтобы проверить, какие методы доступны для этой переменной, — о чем рассказывалось в нашем первом уроке из этой серии. Посмотрите на все доступные методы для $ всего :

$ всего | Get-Member

   Имя типа: Система.Int32
Имя MemberType Определение
---- ---------- ----------
Метод CompareTo int CompareTo (значение System.Object), int CompareTo (значение int), int IComparable.CompareTo (…
Метод Equals bool Equals (System.Object obj), bool Equals (int obj), bool IEquatable [int] .Equals (int ot…
Метод GetHashCode int GetHashCode ()
GetType Тип метода GetType ()
Метод GetTypeCode System.TypeCode GetTypeCode (), System.TypeCode IConvertible.GetTypeCode ()
ToBoolean Method bool IConvertible.ToBoolean (поставщик System.IFormatProvider)
ToByte Method byte IConvertible.ToByte (поставщик System.IFormatProvider)
ToChar Method char IConvertible.ToChar (поставщик System.IFormatProvider)
ToDateTime Метод datetime IConvertible.ToDateTime (поставщик System.IFormatProvider)
ToDecimal Метод decimal IConvertible.ToDecimal (поставщик System.IFormatProvider)
ToDouble Method double IConvertible.ToDouble (поставщик System.IFormatProvider)
ToInt16 Метод краткий IConvertible.ToInt16 (поставщик System.IFormatProvider)
Метод ToInt32 int IConvertible.ToInt32 (поставщик System.IFormatProvider)
ToInt64 Method long IConvertible.ToInt64 (поставщик System.IFormatProvider)
Метод ToSByte sbyte IConvertible.ToSByte (поставщик System.IFormatProvider)
Метод ToSingle float IConvertible.ToSingle (поставщик System.IFormatProvider)
ToString Метод строка ToString (), строка ToString (формат строки), строка ToString (System.IFormatProvide…
Система методов ToType.Объект IConvertible.ToType (тип conversionType, поставщик System.IFormatProvider)
ToUInt16 Метод ushort IConvertible.ToUInt16 (поставщик System.IFormatProvider)
Метод ToUInt32 uint IConvertible.ToUInt32 (поставщик System.IFormatProvider)
Метод ToUInt64 ulong IConvertible.ToUInt64 (поставщик System.IFormatProvider)
Метод TryFormat bool TryFormat (System.Span [char] destination, [ref] int charsWritten, System.ReadOnlySpa…
 

Работа с кавычками и переменными PowerShell

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

$ literal = 'Два плюс один равно: $ (1 + 2)'
$ literal
$ escaped = "Два плюс один равно: $ (1 + 2)"
$ сбежал
 

Одиночные кавычки всегда приводят к буквальной строке. Это означает, что $ literal содержит ровно то, что было загружено в него. Это буквальная строка . Двойные кавычки по-прежнему будут создавать строку, но могут работать с динамическими компонентами внутри этой строки.Обратите внимание, что, экранируя операцию 1 + 2 с синтаксисом $ (1 + 2) , мы сообщаем PowerShell, что нам нужен переменный результат один плюс два. Таким образом, $ экранировано приводит к: Два плюс один равно: 3

Write-Host '$ escaped'
Write-Host "$ escaped"
 

Опять же, у нас есть пример с одинарными (буквальными) и двойными (динамическими) кавычками. Помните, что оба из них по-прежнему приводят к строке, но обратите внимание на различия, попробовав их на своей консоли!

Зарезервированные (постоянные) переменные PowerShell

Есть несколько имен переменных PowerShell, которые являются постоянными и поэтому зарезервированы.Это означает, что вы не сможете использовать эти имена переменных. Вы можете ознакомиться с этим кратким списком, набрав:

# Получить список используемых имен переменных
Get-Variable
 

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

$ HOME = 'c: \ test'
Невозможно перезаписать переменную HOME, поскольку она постоянна или предназначена только для чтения.
В строке: 1 символ: 1
+ $ HOME = 'c: \ test'
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo: WriteError: (HOME: String) [], SessionStateUnauthorizedAccessException
+ FullyQualifiedErrorId: VariableNotWritable
 
Переменные среды PowerShell

Помимо нескольких постоянных переменных, в PowerShell есть переменные, зарезервированные для некоторых данных среды.Вы можете увидеть их список с помощью следующей команды:

# Получить список переменных окружения
Get-ChildItem env:
 

Они содержат информацию о среде, в которой работает PowerShell. Примеры включают имя компьютера ( $ env: COMPUTERNAME ) и текущего пользователя, от имени которого вы работаете ( $ env: USERNAME ).

Собираем все вместе с примером

$ path = Read-Host -Prompt 'Введите путь к файлу, который вы хотите сканировать на предмет наличия больших файлов... '
$ rawFileData = Get-ChildItem -Path $ path -Recurse
$ largeFiles = $ rawFileData | Where-Object {$ _. Length -gt 100MB}
$ largeFilesCount = $ largeFiles | Мера-объект | Select-Object -ExpandProperty Count
Write-Host «У вас есть большие файлы $ largeFilesCount в $ path»
 

Основываясь на всем, что мы узнали до этого момента, мы можем теперь изучить этот простой пример. Read-Host предлагает пользователю буквальную строку, заключенную в одинарные кавычки. Переменная $ path загружается с записью, предоставленной пользователем.Затем Get-ChildItem находит все файлы по указанному пути и загружает результаты в $ rawFileData . Затем мы находим файлы размером более 100 МБ с помощью Where-Object и загружаем эти результаты в $ largeFiles . Используя Measure-Object и Select-Object в конвейере, мы определяем общее количество больших файлов размером более 100 МБ. Затем мы возвращаем пользователю с помощью Write-Host общее количество больших файлов. Обратите внимание, что в последней строке мы используем двойные кавычки, потому что у нас есть динамическая переменная, которую мы хотим отобразить.

Общие типы переменных PowerShell

[строка] Строка символов Юникода

[int] 32-битное целое число
[long] 64-битное целое число
[decimal] 128-битное десятичное значение.
[single] 32-битное число с плавающей запятой
[double] 64-битное число с плавающей запятой

[bool] Boolean True / False

[DateTime] Дата и время

[array] Массив значений
[hashtable] Объект Hashtable
 Навигация для серии 

<< Подготовка к разработке для PowerShell Контроль с помощью логики PowerShell >>

Работа с датой истечения срока действия учетной записи в Active Directory — с помощью PowerShell






Ищи:

  • Подписаться
  • Подписаться
  • Подписаться
  • Подписаться

Свяжитесь с нами

  • Продукты
    • Обзор продукта
    • Мигратор GPO
    • Пакет отчетов по групповой политике
    • Аудит и аттестация групповой политики (GPAA)
    • Менеджер соответствия групповой политике
    • Механизм автоматизации групповой политики
  • ресурса
    • Рассылка новостей
    • Официальные документы
    • Поддержка программного обеспечения SDM
  • Компания
    • О нас
    • Подключить
  • Бесплатная
  • Блог

Ищи:

  • Подписаться
  • Подписаться
  • Подписаться
  • Подписаться
  • Продукты
    • Обзор продукта
    • Мигратор GPO
    • Пакет отчетов по групповой политике
    • Аудит и аттестация групповой политики (GPAA)
    • Менеджер соответствия групповой политике
    • Механизм автоматизации групповой политики
  • ресурса
    • Рассылка новостей
    • Официальные документы
    • Поддержка программного обеспечения SDM
  • Компания
    • О нас
    • Подключить
  • Бесплатная
  • Блог

Свяжитесь с нами

  • Дом
  • О нас
  • Примеры из практики
    • Пример использования: Annese & Associates, Inc.
    • Пример использования: PacStar
  • Связаться
    • Спасибо, что обратились к нам
  • Заявление об ограничении ответственности
  • Скачать пробную версию
  • Лицензионное соглашение с конечным пользователем
  • Бесплатная загрузка

  • GPO
    • GPO Deny Finder 1.0
    • Командлеты Powershell версии GPO
    • Group Policy Health Reporter 1,91
    • Утилита восстановления пароля предпочтений групповой политики
    • Утилита Registry.Pol Viewer
    • SDM GPMC 1.5 командлетов
    • Модуль SDM GPMC 2.0
    • Утилита проверки фильтров WMI
  • Технические документы по GPO

    • Общие сведения о хранилище групповой политики
  • Блог групповой политики
  • продуктов групповой политики

PowerShell: как использовать Get-ADUser для вывода списка всех недавно созданных учетных записей (и недавно измененных учетных записей)

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

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

Вкратце, чтобы просмотреть доступные параметры с помощью Get-AD Тип пользователя:

справка Get-ADUser

Далее мы хотим узнать полный список свойств, которые Get-ADUser может предоставить нам, чтобы мы могли определить конкретное свойство для поиска.Выберите случайного пользователя и введите:

Get-ADUser -identity имя пользователя -property *

Просматривая свойства, вы можете увидеть самые последние два: whenChanged и whenCreated . Это два свойства, с которыми мы будем работать

.

Теперь нам нужно сделать некоторые манипуляции с датой для передачи в командлет Get-ADUser, чтобы мы могли перечислить только учетные записи, созданные в течение xx дней. Для этого мы будем использовать переменную $ DateCutOff вместе с командлетом Get-Date и AddDays .Тип:

$ DateCutOff = (Get-Date) .AddDays (-30)

Это займет сегодняшнюю дату и фактически прибавит к ней -30 дней.

Итак, вы можете видеть, что сегодня 22 июля, а переменная $ DateCutOff — 22 июня. Теперь мы можем использовать это вместе с командлетом Where-Object в свойстве whenCreated .

Тип:

Get-ADUser -Filter * -Property whenCreated | Где {$ _. WhenCreated -gt $ datecutoff} | Имя FT, при создании — Авторазмер

Итак, выше вы можете видеть, что за последние 30 дней были созданы две тестовые учетные записи.

Теперь, если мы изменим свойство whenCreated для свойства whenChanged, мы сможем увидеть все учетные записи, которые были изменены за последние 30 дней.

Тип:

Get-ADUser -Filter * -Property whenChanged | Где {$ _. WhenChanged -gt $ datecutoff} | Имя FT, при изменении — Autosize

Здесь вы можете увидеть все аккаунты, которые были изменены за последние 30 дней.

Ресурсы

Get-ADUser http: // technet.microsoft.com/en-us/library/ee617241.aspx

Get-Date https://technet.microsoft.com/en-us/library/ee692801.aspx https://blogs.technet.microsoft.com/heyscriptingguy/2015/01/21/adding-and-subtracting -даты-с-PowerShell /

Where-Object http://technet.microsoft.com/en-us/library/ee177028.aspx

Форматная таблица https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/format-table

Что за фигня $ _ https: // technet.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *