You have -Querytimeout 0
for the query against sys.databases. That is a query that should always return immediately. But then you are running your script in some databases, but here you don't have -Querytimeout 0
. That is, I think you need:
foreach ($database in $databases) {
#Execute scripts
Invoke-Sqlcmd -ServerInstance $_ -Database $database.name -InputFIle $filepath -Querytimeout 0