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)