这里有一个更高级的版本
find
使用PowerShell的解决方案。它搜索
bdsproj
在指定目录下的文件,并生成
bdsgroup
包含所有项目。
运行脚本后,打开
BDS组
使用D2007将项目转换为
dproj
. D2007还产生
groupproj
,这似乎相当于D2007
BDS组
.
提示:
-
使用运行脚本
-help
查看说明。
-
在打开之前启动D2007
BDS组
,它似乎可以更快地处理项目。
-
您不需要保存项目,打开它们就足以创建
dproj公司
.
感谢:
这是剧本。对我有用:o)
Param(
$path = ".",
$exclude = "",
[switch]$help
)
Set-PSDebug -Strict
$ErrorActionPreference = 'Stop'
# Ensure path is fully qualified and ends with a path delimiter
$path = Join-Path (Resolve-Path $path) ""
# Output file full name ($path\scriptname.bdsproj)
$outfile = Join-Path $path ([IO.Path]::ChangeExtension($MyInvocation.MyCommand.Name, "bdsgroup"))
# Bdsgroup template
$groupXml = [xml]@"
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject>
<PersonalityInfo>
<Option>
<Option Name="Personality">Default.Personality</Option>
<Option Name="ProjectType"></Option>
<Option Name="Version">1.0</Option>
<Option Name="GUID">{$([guid]::NewGuid().ToString())}</Option>
</Option>
</PersonalityInfo>
<Default.Personality>
<Projects>
<Projects Name="Targets"></Projects>
</Projects>
<Dependencies/>
</Default.Personality>
</BorlandProject>
"@
### Functions ###
function ShowUsage()
{
$myName = Split-Path -Leaf $MyInvocation.ScriptName
Write-Host "Usage:"
Write-Host "`t$myName [-path <Path>] [-exclude <Exclude>] [-help]"
Write-Host
Write-Host "`t-path <Path>"
Write-Host "`t`tSpecifies the directory to begin searching for *.bdsproj."
Write-Host "`t`tPath:" $path
Write-Host
Write-Host "`t-exclude <Exclude>"
Write-Host "`t`tSpecifies a directory to exclude from the search."
Write-Host "`t`tExclude:" $exclude
Write-Host
Write-Host "`t-help"
Write-Host "`t`tDisplays this message."
Write-Host
Write-Host "Output will be written to:"
Write-Host "`t" $outfile
Write-Host
Write-Host "Limitations:"
Write-Host "`tDoes not support multiple directories for Path or Exclude."
}
# Get the target name.
# e.g. "D:\dev\src\foo.bdsproj" returns "foo.exe"
function GetTarget($bdsproj)
{
$mainSource = GetMainSource($bdsproj)
$ext = GetTargetExt($mainSource)
Split-Path -Leaf ([IO.Path]::ChangeExtension($mainSource, $ext))
}
# Get the relative project path.
# e.g. If path is "D:\dev" then "D:\dev\src\foo.bdsproj" returns "src\foo.bdsproj"
function GetProject($bdsproj)
{
$prefixLen = $path.Length
$suffixLen = $bdsproj.Length - $prefixLen
$bdsproj.Substring($prefixLen, $suffixLen)
}
# Get the fully qualified MainSource (dpr/dpk) path.
# e.g. "D:\dev\src\foo.bdsproj" returns "D:\dev\src\foo.dpr"
function GetMainSource($bdsproj)
{
$projXml = [xml](Get-Content $bdsproj)
$mainSource = $projXml.BorlandProject."Delphi.Personality".Source.Source |
Where-Object { $_.Name -eq "MainSource" }
$result = Join-Path (Split-Path -Path $bdsproj) $mainSource.InnerText
if (-not (Test-Path $result))
{
throw "No MainSource (dpr/dpk) found for $bdsproj"
}
$result
}
# Get the target extension depending on the source type.
function GetTargetExt($mainSource)
{
$targets = @{"package"="pkg"; "library"="dll"; "program"="exe"}
$targetType = GetTargetType($mainSource)
$targets[$targetType]
}
# Read the target type out of the dpr.
function GetTargetType($mainSource)
{
$name = [IO.Path]::GetFileNameWithoutExtension($mainSource)
$pattern = "^\s*(package|library|program)\s+$name;$"
$matches = (Select-String -Path $mainSource -Pattern $pattern)
if ($matches -eq $null)
{
throw "Unknown target type (pkg/dll/exe) for $mainSource"
}
$matches.Matches[0].Groups[1].Value
}
# Add a project entry to groupXml.
# e.g. <Projects Name="foo.exe">src\foo.bdsproj</Projects>
function AddProject($target, $project)
{
$node = $groupXml.CreateElement("Projects")
$node.SetAttribute("Name", $target)
$node.InnerText = $project
$groupXml.BorlandProject."Default.Personality".Projects.AppendChild($node) | Out-Null
$targets = $groupXml.BorlandProject."Default.Personality".Projects.Projects |
Where-Object { $_.Name -eq "Targets" }
$targets.InnerText = $targets.InnerText + " " + $target
}
### Main ###
if ($help)
{
ShowUsage
}
else
{
Get-ChildItem -Path $path -Include "*.bdsproj" -Recurse |
Where-Object { $exclude -eq "" -or $_.FullName -notmatch $exclude } |
ForEach-Object { AddProject (GetTarget $_.FullName) (GetProject $_.FullName) }
$groupXml.OuterXml | Out-File -Encoding "UTF8" $outfile
}