ShS's Blog

Just another sysadmin's weblog

Scripting Games 2010. Advanced Event 8 (Creating Text Files of Specific Sizes)

Posted by shs на 2010/05/25

Восьмое задание:

Event Scenario

Your IT networking team has asked for assistance. They are testing network throughput on the Layer 4 switches. In performing their tests, they need the ability to create text files that are specific sizes. They have specifically requested the following sizes: 100 KB, 1 MB, 10 MB, and 100 MB. Because there are several members of the networking team involved in the project, and because they will be working on many different machines during the survey, they have requested a script that will create text files of those specific sizes.

 The networking team said if the script would create other sizes, it would be nice, but it is not a requirement. In addition, the files should be filled with actual text (in other words, they should not be empty). If the text is configurable, that would be wonderful, but again it is not a specific requirement. The name of the text file that is created should conform to this pattern: TestFile100K.txt. The destination folder should be configurable. The networking team said that the size of the file should be accurate to plus or minus 1 percent, but they would of course love it if the files were the exact size.

  

Алгоритм решения задачки вполне прост:

  • Первый файл наименьшего размера создаем с нуля, заполняя его заданной строкой-заполнителем.
  • Каждый последующий файл большего размера создается многократным слиянием предыдущего файла меньшего размера, разница между объемами  нового файла и суммой целого количества файлов  предыдущего размера заполняется добавлением строк-заполнителей, как при создании первого файла.

 Я написал этот скрипт целиком на PoSh, хотя  в реальной жизни все-таки прибег бы к использованию cmd.exe и команды copy a.txt+a.txt+a.txt new_file.txt для выполнения слияния файлов, т.к. она работает в разы быстрее, нежели Get-Content –ReadCount 0 …>>new_file.txt

 Результат здесь:

<#
   Create-TestFiles.ps1 shs 20100509
.Synopsis
   	Creates files of the specified size
	
	Create-TestFiles.ps1 [Text] [DestFolder] [FileNamePart] [-Help]
	  
.Parameter Text
	Text to fill new file
	
.Parameter DestFolder
	Full name of destination folder where new file will be created
	
.Parameter FileNamePart
	First part of name of new file
	
.Switch Parameter Help
	Show this comment as help
	
.Example
	Create-TestFiles.ps1 -h
	Create-TestFiles.ps1 -Text "Test string Test string Test string" -FileNamePart "NewTestFile"
	
   #>
param($Text="This is a realy long, silly bogus string wich wil be used to fill up", $DestFolder="c:\temp\1", $FileNamePart="TestFile", [switch]$Help)
#
###############################################################################
#
# Function create new file by multiplying content of source file
#
#.Parameter <strLimit>
#    String containing size of new file
#
#.Parameter <NewFile>
#    Full name of new File
#
#.Parameter <SourceFile>
#    Full name of source file
#
Function Create-TestFile ($strLimit, $NewFile, $SourceFile) {
   $numLimit=Invoke-Expression $strLimit
   Write-Host "`nCrteating $strLimit file..."
   #create new file
   $Text>$NewFile
   #get multiplier value to fill new file
   $Factor=[Math]::Round($numLimit /(dir $SourceFile).length)
   #combine content of source files
   for ($i=1;$i -le $Factor;$i++) {
       Write-Verbose "Loop index: $i/$Factor"
       (Get-Content -Path $SourceFile -ReadCount 0) >> $NewFile
   }
   #add strings of $Text up to $Limit
   while ((dir $NewFile).length -le $numLimit) {
       $Text>>$NewFile
   }
   Write-Host "`n$strLimit file has been created"
}
###############################################################################
#
#    Function get name of new file
#
#.Parameter <Suffix>
#    suffix of new file name
#
Function Get-NewFileName($Suffix) {
   ($DestFolder -replace "\$")+"\"+$FileNamePart+"$Suffix.txt"
}
###############################################################################
#
# Function Show-Help. Write to the host first blok comment of this script
#
#.Parameter <ScriptFullName>
#    Full name of the script name of the script, whose comment will be displayed
#
#
Function Show-Help ($ScriptFullName){
   if ($ScriptFullName) {
       $IsHelpLine=$false
       switch -file $ScriptFullName {
           {$_ -match "<#"}     {Write-Host $_;$IsHelpLine=$true;continue}
           {$_ -match "#>"}     {Write-Host $_;$IsHelpLine=$false;break}
           {$IsHelpLine}        {Write-Host $_;}
       }
   }
}
###############################################################################
#
#
#======================= Script entry point ===================================
#
$VerbosePreference="Continue"
cls
if (!$Help) {
   Write-Host "`nCrteating 100kb file..."
   #create 100kb file
   $100kbFile=($DestFolder -replace "\$")+"\"+$FileNamePart+"100kb.txt"
   #fill in 100kb file with the $text
   $Text>$100kbFile
   while ((dir $100kbFile).length -le 100*1kb) {
       $Text>>$100kbFile
   }
   Write-Host "100kb file has been created"
   #create 1mb file
   $1mbFile=Get-NewFileName "1mb"
   Create-TestFile -strLimit "1mb" -NewFile $1mbFile -SourceFile $100kbFile
   #create 10mb file
   $10mbFile=Get-NewFileName "10mb"
   Create-TestFile -strLimit "10mb" -NewFile $10mbFile -SourceFile $1mbFile
   #create 100mb file
   $100mbFile=Get-NewFileName "100mb"
   Create-TestFile -strLimit "100mb" -NewFile $100mbFile -SourceFile $10mbFile
}
else {
   #Write top block comment as help
   Show-Help $MyInvocation.MyCommand.Path
} 
Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

 
%d такие блоггеры, как: