$ready = Read-Host "How many you want?: "
$i = 0
do{
(-join(1..12 | ForEach {((65..90)+(97..122)+(".") | % {[char]$_})+(0..9)+(".") | Get-Random}))
$i++
} until ($i -match $ready) Out-File C:/numbers.csv -Append
如果我给脚本一个值10-它会生成10个随机数,并在pshell上显示出来。它甚至会生成一个名为numbers.csv的新文件。但是,它不会将生成的输出添加到文件中。这是为什么?
你的Out-File C:/numbers.csv -Append
电话是一个完全独立的声明从你的do
循环,以及Out-File
没有任何输入呼叫简单地创建一个空文件。[1]
您需要链接(连接)命令|
以使它们在管道中运行。
但是,对于诸如循环这样的语句do { ... } until
,该语句不能按原样工作,但是您可以通过将其封装在脚本块()中并进行调用,将其转换为可以用作管道一部分的命令。它的调用操作(在一个运行子范围),或,在成员访问运营商(直接调用方的范围内运行):{ ... }
&
.
[int] $ready = Read-Host "How many you want?"
$i = 0
& {
do{
-join (1..12 | foreach {
(65..90 + 97..122 + '.' | % { [char] $_ }) +(0..9) + '.' | Get-Random
})
$i++
} until ($i -eq $ready)
} | Out-File C:/numbers.csv -Append
注意[int]
类型约束的转换Read-Host
输出,这始终是一个字符串,在数量和使用的-eq
运营商,而不是文本及基于正则表达式,-match
运营商的until
条件; 此外,与的不必要分组(...)
也已删除。
注意:一个替代的使用脚本块与任一&
或.
操作员要使用$(...)
,该次表达式运算,如图MikeM的有用的答案。这两种方法之间的区别在于,前者流输出到管道-即输出对象一一-而$(...)
总是收集所有输出在内存中,在前面。
对于短小的输入集这不会有太大的差别,但在内存中的集合,$(...)
进行可以成为具有大的输入集问题的,所以对& { ... }
/. { ... }
方法通常是优选的。
阿诺范博文的回答显示了你一个简单的替代do ... until
循环基于一个for
循环。
将foreach
循环与..
,范围运算符组合起来更加简洁明了(并且数组构造的成本通常可以忽略不计,并且总体而言仍然可以明显提高执行速度):
[int] $ready = Read-Host "How many you want?"
& {
foreach ($i in 1..$ready) {
-join (1..12 | foreach {
([char[]] (65..90 + 97..122)) + 0..9 + '.' | Get-Random
})
}
} | Out-File C:/numbers.csv -Append
上面还显示了通过[char[]]
强制转换将原始命令简化的方法,该强制转换将代码点数组直接转换为字符数组。
在PowerShell [Core] 7+中,您可以利用Get-Random
的-Count
参数进一步简化:
[int] $ready = Read-Host "How many you want?"
& {
foreach ($i in 1..$ready) {
-join (
([char[]] (65..90 + 97..122)) + 0..9 + '.' | Get-Random -Count 12
)
}
} | Out-File C:/numbers.csv -Append
最后,你可能已经避免了声明的完全循环,以及所使用的小命令代替ForEach-Object
(其内置别名,也许是混淆的,是同样 foreach
的,但也there'a %
),因为你已经在做内部的循环(1..12 | foreach ...
) :
[int] $ready = Read-Host "How many you want?"
1..$ready | ForEach-Object {
-join (1..12 | ForEach-Object {
([char[]] (65..90 + 97..122)) + 0..9 + '.' | Get-Random
})
} | Out-File C:/numbers.csv -Append
[1]在Windows PowerShell中,Out-File
默认情况下使用UTF-16LE(“ Unicode”)编码,因此,即使概念上为空的文件仍包含2个字节,即UTF-16LE BOM。在PowerShell [Core] v6 +中,所有cmdlet均默认使用无BOM的UTF-8,因此您将真正得到一个空(0
字节)文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句