随机选择命令执行?

问题描述 投票:0回答:4

想法:我想使用

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 random command invoke
4个回答
4
投票
  • 使用脚本块 (

    { ... }
    ) 在变量中存储任意命令。使用调用运算符
    &
    按需调用脚本块。

  • 一些旁白:

  • $(...)
    ,子表达式运算符仅需要 (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


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



-1
投票


-1
投票

& $test[0]

© www.soinside.com 2019 - 2024. All rights reserved.