Powershell随机选择命令执行

时间:2018-09-15 22:09:36

标签: powershell

想法:我想使用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))

如果还有其他方法可以执行此操作,或者需要进一步说明,或者有任何其他问题,请随时提出:)谢谢!

4 个答案:

答案 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”