尝试使用此PowerShell脚本在Windows中生成随机文件:
param([string]$path = "C:\temp", [int]$size = "1024", [long]$number= "1000")
Write-Host "Path: $path"
Write-Host "Size of file: $size"
Write-Host "Number of files: $number"
Write-Host "Started at:"
Get-Date -Format HH:mm:ss
md -Force $path |out-null
$script:StartTime = $(Get-Date)
for($i=0; $i -le $number - 1 ; $i++){
[Byte[]]$out=@(); 0..($size-1) | %{$out += Get-Random -Minimum 0 -Maximum 255};
[System.IO.File]::WriteAll("$path\$i.bin",$out)
if (-Not ($i % 100) -and ($i -ne 0 )) {
Write-Host "$i were created"
$elapsedTime = $(Get-Date) - $script:StartTime
$script:StartTime = $(Get-Date)
Write-Host "$elapsedTime"
}
}
当我想将文件大小从1KB增加到1MB时,即使是一个文件也需要很长时间,但我需要数千个文件。有没有办法解决这个瓶颈?
答案 0 :(得分:0)
您可以关注评论中的示例并使用PowerShell执行所有操作,也可以使用file param fsutil.exe文件系统工具更有效地创建文件。
fsutil file createnew "d:\temp\1MOFile.txt" 1000000
答案 1 :(得分:0)
#default values
param([string]$path = "C:\temp", [int]$size = "1048576", [long]$number= "10000")
Write-Host "Path: $path"
Write-Host "Size of file: $size"
Write-Host "Number of files: $number"
##dd.exe should be in same dir
$path_to_dd = Get-Location
Write-Host "Started at:"
Get-Date -Format HH:mm:ss
md -Force $path |out-null
$script:StartTime = $(Get-Date)
for($i=0; $i -le $number - 1 ; $i++){
#genarate files
(& $path_to_dd\dd.exe if=/dev/random of=$path\$i.bin bs=$size count=1) 2>&1 | Out-Null
#periodical report to stdout with timestamp every 1k files
if (-Not ($i % 1000) -and ($i -ne 0 )) {
Write-Host "$i were created"
$elapsedTime = $(Get-Date) - $script:StartTime
$script:StartTime = $(Get-Date)
Write-Host "$elapsedTime"
}
}
Write-Host "Finished at:"
Get-Date -Format HH:mm:ss
答案 2 :(得分:0)
Function New-RandomFile {
Param(
$Path = '.',
$FileSize = 1kb,
$FileName = [guid]::NewGuid().Guid + '.txt'
)
(1..($FileSize/128)).foreach({-join ([guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid -Replace "-").SubString(1, 126) }) | set-content "$Path\$FileName"
}
这需要491毫秒来生成1mb文件。运行:
New-RandomFile -FileSize 1mb
更新:
我已更新我的函数以使用ScriptBlock,因此您可以将“NewGuid()”方法替换为您想要的任何内容。
在这种情况下,我制作1kb块,因为我知道我从不创建较小的文件。这大大提高了我的功能速度!
Set-Content强制结束NewLine,这就是每次写入文件时需要删除2个字符的原因。我用[io.file] :: WriteAllText()代替了它。
Function New-RandomFile_1kChunks {
Param(
$Path = (Resolve-Path '.').Path,
$FileSize = 1kb,
$FileName = [guid]::NewGuid().Guid + '.txt'
)
$Chunk = { [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid -Replace "-" }
$Chunks = [math]::Ceiling($FileSize/1kb)
[io.file]::WriteAllText("$Path\$FileName","$(-Join (1..($Chunks)).foreach({ $Chunk.Invoke() }))")
Write-Warning "New-RandomFile: $Path\$FileName"
}
如果您不在乎所有块都是随机的,您可以简单地调用()生成1kb块一次..这会大大提高速度,但不会使整个文件随机。
Function New-RandomFile_Fast {
Param(
$Path = (Resolve-Path '.').Path,
$FileSize = 1kb,
$FileName = [guid]::NewGuid().Guid + '.txt'
)
$Chunk = { [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid +
[guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid + [guid]::NewGuid().Guid -Replace "-" }
$Chunks = [math]::Ceiling($FileSize/1kb)
$ChunkString = $Chunk.Invoke()
[io.file]::WriteAllText("$Path\$FileName","$(-Join (1..($Chunks)).foreach({ $ChunkString }))")
Write-Warning "New-RandomFile: $Path\$FileName"
}
测量 - 命令所有这些更改以生成10mb文件:
执行New-RandomFile:35.7688241秒。
执行New-RandomFile_1kChunks:25.1463777秒。
执行New-RandomFile_Fast:1.1626236秒。