# PowerShell script to automate the search of DLL files

I often write different applications in C++ using different libraries, and sometimes it takes a lot of time to find where are the *.dll files to distribute. I use Dependency Walker but it still takes a lot of time to look in the GUI. I wrote a PowerShell script that will find all used libraries and do something with them. Please review my code.

Param
(
[Parameter(Mandatory=$true, Position=0)] [ValidateScript({Test-Path$_ -PathType Leaf})]
[String]$Path, [Parameter()] [ValidateScript({Test-Path$_ -PathType Container})]
[String[]]$Exclude ) function likeAnyOf($obj,$array) { foreach($item in $array) { if($obj -like $item) { return$item
}
}
return $null } Set-StrictMode -Version Latest$systemPath = [System.Environment]::SystemDirectory
$tempName = [System.IO.Path]::GetTempFileName() # generate a temporary filename Start-Process depends.exe -ArgumentList '/c','/f:1',"/oc:$tempName",$Path -Wait -NoNewWindow # wait until it writes all the data$modules = Import-Csv $tempName -Encoding Default | Select-Object -Property Module -Unique # read the output of depends.exe and select all unique DLL paths Remove-Item -Path$tempName -Force # delete the temporary file

$dllsToCopy = @{} foreach($module in $modules) {$modulePath = $module.Module$moduleParent = Split-Path $modulePath -Parent$moduleName = Split-Path $modulePath -Leaf if($moduleParent -like $systemPath ) { Write-Verbose "Skipped$moduleName as a system module ($moduleParent)" continue }$excluded = likeAnyOf $moduleParent (Resolve-Path$Exclude)
if($excluded -ne$null)
{
Write-Host "Skipped $moduleName as explicitly excluded ($excluded)"
continue
}

$exists = Test-Path$modulePath -PathType Leaf
if($exists) {$dllsToCopy.Add($moduleName,$modulePath)
Write-Host "Added $moduleName found at$moduleParent"
}
else
{
Write-Error "Couldn't find $moduleName" } }  ## 1 Answer You can replace all this: function likeAnyOf($obj,$array) { foreach($item in $array) { if($obj -like $item) { return$item
}
}
return $null } # ...$excluded = likeAnyOf $moduleParent (Resolve-Path$Exclude)


With this:

$excluded = Resolve-Path$Exclude | ? { $moduleParent -like$_ }


The question mark (?) is an alias for Where-Object, so read up on that for an explanation.

if ($excluded -ne$null)
{
# ...
}


you can do this:

if (\$excluded)
{
# ...
}


It's just a little bit easier to read.