想法:我想使用
set-date
的三个选项,.AddHours()
,.AddMinutes()
,.AddSeconds()
随机更改时间。我的第一个想法是将它们存储在数组中并随机引用它们,但它没有执行。它只是存储字符串打印而不是执行它。
到目前为止的代码:
$test = "Set-Date -Date (Get-Date).AddHours($\(Get-Random -Maximum 25))", "Set-Date -Date (Get-Date).AddSeconds($\(Get-Random -Maximum 61))", "Set-Date -Date (Get-Date).AddMinutes($\(Get-Random -Maximum 61))"
输出:
$Test
Set-Date -Date (Get-Date).AddHours(22) Set-Date -Date (Get-Date).AddSeconds($\(Get-Random -Maximum 61)) Set-Date -Date (Get-Date).AddMinutes($\(Get-Random -Maximum 61))
$test[0]
Set-Date -Date (Get-Date).AddHours(22)
$(Get-Random -InputObject $test)
Set-Date -Date (Get-Date).AddMinutes($\(Get-Random -Maximum 61))
如果有其他方法可以做到这一点,如果您需要进一步解释,或者有任何其他问题,请随时询问:)谢谢!
使用脚本块 (
{ ... }
) 在变量中存储任意命令。使用调用运算符 &
按需调用脚本块。
一些旁白:
不要使用
\
作为转义字符 - PowerShell 需要使用 `
。
要执行存储在strings中的完整命令,您需要
Invoke-Expression
;然而,Invoke-Expression
很少是正确的工具,并且存在安全风险 - 尽可能避免使用它。
$(...)
,子表达式运算符仅需要 (a) 在 可扩展字符串 ("..."
) 内,并且通常用于包围 多个 语句;在可扩展字符串之外,作为表达式的一部分,您不需要它来执行单个命令,例如 Get-Random -Maximum 25 - enclosing the command in
(...)` 就足够了。
&
,调用运算符,执行存储在字符串中的
命令名称/路径,而不是整个命令行(命令加参数)。它还用于调用脚本块。
Set-Date
替换为
Get-Date
,这样试验它们就不会产生副作用。# Store the commands in an array of script blocks.
$test = { Get-Date -Date (Get-Date).AddHours((Get-Random -Maximum 25)) },
{ Get-Date -Date (Get-Date).AddSeconds((Get-Random -Maximum 61)) },
{ Get-Date -Date (Get-Date).AddMinutes((Get-Random -Maximum 61)) }
# Select a random command and execute it using &
& (Get-Random $test)
性能说明:为了获得更好的性能,用于从中随机选择元素的输入对象数组
$test
在此处作为
直接参数传递(隐式绑定到
-InputObject
参数),而不是通过管道(
$test | Get-Random
)。对于小型阵列,差异可以忽略不计,但对于较大的阵列,差异很重要。但请注意,cmdlet 通常不接受数组作为一个整体作为参数,在这种情况下必须使用管道 - 请参阅GitHub问题#4242。
首先,我们从 3 个方法中随机选择一个,然后调用它!
$now = Get-Date
$value = Get-Random -Maximum 61
$method = $now.AddSeconds,$now.AddMinutes,$now.AddHours | Get-Random
Set-Date -Date $method.Invoke($value)
这并没有考虑到不同时间单位的不同最大值,但它可能会给您一些思考。
还请考虑 DateTime 对象有一个
.Add()
方法,该方法采用
[TimeSpan]
对象,因此您也可以预先计算时间跨度,然后使用 $now.Add($timespan)
。从你的问题中不清楚为什么你想在小时分钟和秒之间交替,所以如果我假设你试图将日期更改为未来的某个随机时间量,小于或等于24小时,你的问题变得简单多了:
$offset = Get-Random -Maximum 86400 # or 86401 if you want
$timespan = New-TimeSpan -Seconds $offset
Set-Date -Adjust $timespan
您可以看到,在这种情况下,您可以使用
-Adjust
参数,而不是获取当前日期并手动调用其
.Add()
方法。如果您必须在偏移量单位之间切换,让我们尝试选择随机哈希表并将其用作
New-TimeSpan
的参数:
$chaos = @(
@{ Seconds = (Get-Random -Maximum 61) } ,
@{ Minutes = (Get-Random -Maximum 61) } ,
@{ Hours = (Get-Random -Maximum 25) }
) | Get-Random
$timespan = New-TimeSpan @chaos
Set-Date -Adjust $timespan
& $test[0]