Это сообщение довольно точно указывает c и говорит, что Invoke-SqlCmd не нравится то, что вы передаете. Используемые типы вариантов, которые передаются, важны.
This ...
$files = Get-ChildItem -Path $PSScriptRoot -Recurse
... конечно, заселяется раньше, чем что-либо еще происходит. Независимо от того, что вы делаете потом.
К вашему сведению, что касается этого ...
Where-Object { $_.Name -match $regex};
... вам действительно не нужна эта точка с запятой, в PowerShell, за исключением случаев, указанных в c случаев. Точка с запятой - это терминатор кода, обычно используемый в окне consolehost, чтобы держать вещи в одной строке, но в большинстве случаев это не то, что действительно нужно для скриптов или модулей.
Вы увидите, что его используют люди, пришедшие с других языков, из-за своих привычек, а также из-за людей, пытающихся втиснуть все в одну строку и назвавших это одной строкой, чего на самом деле нет.
Попробуйте это вместо этого.
(Get-ChildItem -Path $PSScriptRoot -Filter $RegEx).FullName[0]
Итак, вы получите что-то более прямое, как это ...
$regex = '*.sql'
(Get-ChildItem -Path $PSScriptRoot -Filter $RegEx).FullName[0] |
Invoke-Sqlcmd -InputFile $PSItem
Таким образом, нет причина дополнительной переменной и добавление Where-Object и точечной нотации в вызове Invoke-Sqlcmd.
Вы также могли бы сделать это ...
Invoke-Sqlcmd -InputFile $files[0].FullName
... this путь
Invoke-Sqlcmd -InputFile ($files.FullName)[0]