Initial commit
This commit is contained in:
+109
@@ -0,0 +1,109 @@
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Executable,
|
||||
|
||||
[Parameter(Mandatory = $false)]
|
||||
[string]$Output = "artifacts"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
if (-not (Test-Path $Executable)) {
|
||||
throw "Executable does not exist: $Executable"
|
||||
}
|
||||
|
||||
New-Item -ItemType Directory -Force -Path $Output | Out-Null
|
||||
|
||||
$windowsDirectories = @(
|
||||
$env:WINDIR,
|
||||
(Join-Path $env:WINDIR "System32"),
|
||||
(Join-Path $env:WINDIR "SysWOW64")
|
||||
)
|
||||
|
||||
$processed = @{}
|
||||
|
||||
function Test-IsWindowsSystemDll {
|
||||
param(
|
||||
[string]$Name
|
||||
)
|
||||
|
||||
foreach ($directory in $windowsDirectories) {
|
||||
$path = Join-Path $directory $Name
|
||||
|
||||
if (Test-Path $path) {
|
||||
return $true
|
||||
}
|
||||
}
|
||||
|
||||
return $false
|
||||
}
|
||||
|
||||
function Find-Dependency {
|
||||
param(
|
||||
[string]$Name,
|
||||
[string]$BinaryDirectory
|
||||
)
|
||||
|
||||
$localPath = Join-Path $BinaryDirectory $Name
|
||||
|
||||
if (Test-Path $localPath) {
|
||||
return $localPath
|
||||
}
|
||||
|
||||
$command = Get-Command $Name -ErrorAction SilentlyContinue
|
||||
|
||||
if ($command) {
|
||||
return $command.Source
|
||||
}
|
||||
|
||||
return $null
|
||||
}
|
||||
|
||||
function Copy-Dependencies {
|
||||
param(
|
||||
[string]$Binary
|
||||
)
|
||||
|
||||
$binaryDirectory = Split-Path -Parent $Binary
|
||||
|
||||
$dependencies = dumpbin /DEPENDENTS $Binary |
|
||||
Select-String '^\s+.*\.dll$' |
|
||||
ForEach-Object { $_.Line.Trim() } |
|
||||
Sort-Object -Unique
|
||||
|
||||
foreach ($dll in $dependencies) {
|
||||
|
||||
$key = $dll.ToLowerInvariant()
|
||||
|
||||
if ($processed.ContainsKey($key)) {
|
||||
continue
|
||||
}
|
||||
|
||||
$processed[$key] = $true
|
||||
|
||||
if (Test-IsWindowsSystemDll $dll) {
|
||||
Write-Host "Skipping Windows system dependency: $dll"
|
||||
continue
|
||||
}
|
||||
|
||||
$source = Find-Dependency `
|
||||
-Name $dll `
|
||||
-BinaryDirectory $binaryDirectory
|
||||
|
||||
if (-not $source) {
|
||||
Write-Warning "Could not locate dependency: $dll"
|
||||
continue
|
||||
}
|
||||
|
||||
$destination = Join-Path $Output (Split-Path -Leaf $source)
|
||||
|
||||
if (-not (Test-Path $destination)) {
|
||||
Write-Host "Copying dependency: $source"
|
||||
Copy-Item $source $destination -Force
|
||||
}
|
||||
|
||||
Copy-Dependencies -Binary $source
|
||||
}
|
||||
}
|
||||
|
||||
Copy-Dependencies -Binary $Executable
|
||||
Reference in New Issue
Block a user