Я пытаюсь найти способ просмотреть дату/время создания переменной в Powershell. Например, если я создаю переменную:
PS C:\> $name = 'alice'
PS C:\> $name
alice
Когда я смотрю на доступные свойства, я получаю только:
PS C:\> Get-Variable name | Format-List
Name : name
Description :
Value : alice
Visibility : Public
Module :
ModuleName :
Options : None
Attributes : {}
Есть ли другой метод, который покажет мне дату/время создания переменной?
Нет....
@user459872 user459872 Я пытаюсь создать сценарий, который будет запускаться несколько раз в течение дня с использованием одного и того же зашифрованного пароля, установленного в переменной. Я хочу, чтобы переменная была независимой от скрипта, чтобы ей не приходилось продолжать работу. Я думаю, что его нужно удалить в определенное время, поскольку я не могу найти способ заставить его самоуничтожиться (лучший вариант, если бы это было возможно).
Я не знаю, зачем вам знать время создания переменной. Вероятно, PowerShell недостаточно полезно отслеживать
Это можно сделать косвенно через историю, потому что StartExecutionTime
и EndExecutionTime
записываются, поэтому можно узнать продолжительность каждой выполненной команды, даже если вы забыли использовать Measure-Command
(Get-History | Where-Object {$_.CommandLine -like '$name = *'}).StartExecutionTime
Конечно, вам может потребоваться изменить строку соответствия, чтобы она лучше соответствовала, например $_.CommandLine -match '\b\$name\s*=\s*'
, но это все равно не будет работать во всех случаях, поскольку может соответствовать строке в части комментария или внутри строки. Он также может возвращать неправильный результат для сложных команд, таких как
command that takes a long time; $name = 'alice'
Короткий ответ: нет.
Длинный ответ: нет, без использования обходных путей для регистрации событий.
Самый простой сценарий потребует создания всех переменных следующим образом:
$ThisIsAVariable = 'But a String' | Add-Member -MemberType NoteProperty -Name Creationtime -Value (Get-date) -PassThru
Полезный ответ Сиртао отвечает на ваш вопрос, как он задан.
Позвольте мне дополнить это решением, которое соответствует вашей конечной цели: самоуничтожению переменной на основе тайм-аута:
Предполагая, что у вас определена функция Set-ExpiringGlobalVariable
(см. исходный код ниже), вы можете вызвать ее следующим образом:
Set-ExpiringGlobalVariable mySecret someSecret 300
При этом создается глобальная переменная $mySecret
со значением 'someSecret'
, которая автоматически удаляется через 300 секунд == 5 минут (самое раннее - зависит от того, когда двигатель снова станет простаивать).
Если вы сначала установите $VerbosePreference = 'Continue'
глобально, во время удаления будет напечатано подробное сообщение.
Примечание:
Решение поддерживает только создание глобальных переменных, которые самоуничтожаются.
Он использует Register-EngineEvent с событием PowerShell.OnIdle
engine для запуска кода, когда движок простаивает, что особенно происходит, когда управление возвращается в интерактивную подсказку.
-SupportEvent
по умолчанию скрыт из Get-EventSubscriber; добавьте -Force
, чтобы показать это.Словарь имен самоуничтожающихся переменных вместе с временными метками их срока действия хранится в глобальной вспомогательной переменной $__segv_Helper
, которая, поскольку она объявлена с опцией Private
, не будет видна дочерним областям действия (например, сценариям).
Set-ExpiringGlobalVariable
исходный код:
function Set-ExpiringGlobalVariable {
param($Name, $Value, $TimeoutSeconds = 300)
Set-Variable -Scope Global $Name $Value
$expirationDate = [datetime]::UtcNow.AddSeconds($TimeoutSeconds)
if (-not ($helperVarObj = Get-Variable -ErrorAction Ignore -Scope Global '__segv_Helper')) {
Register-EngineEvent -SourceIdentifier PowerShell.OnIdle -SupportEvent -Action {
if ($dictOfExpiringVariables = Get-Variable -ValueOnly -ErrorAction Ignore -Scope Global '__segv_Helper') {
$utcNow = [datetime]::UtcNow
@($dictOfExpiringVariables.GetEnumerator()) | Where-Object Value -le $utcNow | ForEach-Object {
Write-Verbose "Removing global variable `$$($_.Key); it expired on $($_.Value.ToLocalTime())"
$dictOfExpiringVariables.Remove($_.Key)
Remove-Variable -ErrorAction Ignore -Force -Scope Global $_.Key
}
}
}
$helperVarObj = Set-Variable -PassThru -Scope Global -Option Private, Constant '__segv_Helper' ([ordered] @{})
}
$helperVarObj.Value[$Name] = $expirationDate
}
Мне интересно узнать вариант использования.