This is in addition to the answers from Adam and Harsh. If your branch has large number of child items and you are adding multiple language versions to each item, adding language version will be time taking process.
To address this, you should set BulkUpdateContext in your scripts to tell Sitecore explicitly not to trigger events and pipelines while the language versions are being created. In such case the script will look like -
$languages = Get-ChildItem /sitecore/System/Languages -recurse | Select $_.name
New-UsingBlock (New-Object Sitecore.Data.BulkUpdateContext) {
$query= "fast:<Path to branch of content tree whose children need language version>/*"
$items = Get-Item -Path "master:" -Query $query
foreach($item in $items){
foreach($language in $languages){
$languageVersion = Get-Item -Path $icon.Paths.Path -Language $language.Name
#check if language version already exists
if($languageVersion -eq $null){
Add-ItemLanguage -Item $icon -Language "en" -TargetLanguage $language.Name -IfExist OverwriteLatest
}
}
}
}