想法:我想使用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))
如果还有其他方法可以执行此操作,或者需要进一步说明,或者有任何其他问题,请随时提出:)谢谢!
答案 0 :(得分:1)
使用脚本块({ ... }
)将任意命令存储在变量中。使用呼叫操作符&
按需调用脚本块。
一些助手:
请勿使用\
作为转义字符-PowerShell希望使用`
。
要执行存储在 strings 中的完整命令,您需要Invoke-Expression
;但是,Invoke-Expression
is rarely the right tool, and is a security risk - avoid it whenever possible。
$(...)
,仅需要(a)在可扩展字符串("..."
)中的子表达式运算符,并且通常将 multiple 括起来陈述;在可扩展字符串之外,作为表达式的一部分,对于单个命令,例如Get-Random -Maximum 25 - enclosing the command in
(...)`,您不需要就足够了。
&
执行存储在字符串中的命令名称/路径,而不是整个命令 line (命令加参数)。它还用于调用脚本块。
注意:我在下面的命令中将Set-Date
替换为Get-Date
,以便进行实验不会引起副作用。
# Store the commands in 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 -InputObject $test)
答案 1 :(得分:0)
这里有些方法不涉及在字符串中生成代码。
首先,让我们从所需的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
答案 2 :(得分:-1)
您需要在字符串上使用调用运算符。或者,我不完全了解您的要求。
& $test[0]
答案 3 :(得分:-1)
您可以使用invoke-expression / command。或只使用&“ string”