Powershell随机选择要执行的命令

Powershell随机选择要执行的命令,powershell,Powershell,想法:我想使用set date的三个选项,.AddHours(),.AddMinutes(),.AddSeconds()随机更改时间。我的第一个想法是将它们存储在一个数组中并随机引用它们,但它不会执行。它只是存储字符串打印,而不是执行它 迄今为止的代码: $test = "Set-Date -Date (Get-Date).AddHours($\(Get-Random -Maximum 25))", "Set-Date -Date (Get-Date).AddSeconds($\(Get-Ran

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

如果有其他方法可以做到这一点,如果您需要进一步的解释,或者如果有任何其他问题,请随时提问:)谢谢

您需要对字符串使用调用运算符。或者,我不完全理解您的要求

& $test[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]
对象,因此您也可以预先计算一个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()
方法

如果必须在偏移量单位之间切换,让我们尝试选择随机哈希表,并将其用作
新时间跨度的参数

$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
  • 使用脚本块(
    {…}
    )在变量中存储任意命令。使用调用操作符
    按需调用脚本块

  • 一些旁白:

    • 不要使用
      \
      作为转义字符-PowerShell希望使用
      `

    • 要执行存储在字符串中的完整命令,需要调用表达式;然而

  • $(…)
    ,子表达式运算符只需要(a)在可扩展字符串(
    “…”
    )中,通常用于封装多个语句;在可扩展字符串之外,作为表达式的一部分,对于单个命令,例如
    Get Random-最大25-将命令包含在
    (…)`中就足够了

  • 调用操作符
    &
    执行存储在字符串中的命令名/路径,而不是整个命令行(命令加参数)。它还用于调用脚本块

注意:我在下面的命令中将
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通常不接受数组作为整体作为参数,在这种情况下,必须使用管道-请参阅。

Invoke Expression有效,但&“String”无效。谢谢不起作用,但为了将来参考,“调用表达式”起作用!无论如何谢谢你<代码>&
仅适用于命令名或路径,不适用于完整的命令行
&“cmd”/c echo hi
有效(参数单独指定),
&“cmd/c echo hi”
无效。很高兴听到这个消息,@phillylclause89;请看我的更新。很好的更新。性能dif是基于列表的长度,还是脚本块的复杂性会影响它?@Phillyclause89:这只是关于数组的元素计数。
& $test[0]
$now = Get-Date
$value = Get-Random -Maximum 61
$method = $now.AddSeconds,$now.AddMinutes,$now.AddHours | Get-Random
Set-Date -Date $method.Invoke($value)
$offset = Get-Random -Maximum 86400   # or 86401 if you want
$timespan = New-TimeSpan -Seconds $offset
Set-Date -Adjust $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
# 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)