Файлы фильтра Powershell по результирующему набору и копированию SQL Server - PullRequest
0 голосов
/ 12 февраля 2010

Я выполняю запрос в SQL Server и возвращаю набор результатов из одного столбца. Мне нужно перебрать набор результатов и найти имена файлов, соответствующие записи из набора результатов. Часть имени файла является порядковым номером. Мне нужно отсортировать файлы в порядке возрастания, выбрать первый файл, а затем скопировать только этот файл в подкаталог. Записи в наборе результатов выглядят так:

MEMBERS.net MEMBERS_COMMENTS1.net MEMBERS_COMMENTS2.net MEMBERS_LANGUAGE.net MEMBERS_COVER_OHC.net MEMBERS_PROBLEM_LIST.net

Имена файлов имеют такую ​​структуру:

00_1914330_MEMBERS.net

Может кто-нибудь сказать мне, почему это не достигает моего конечного результата?

add-pssnapin sqlservercmdletsnapin100
add-pssnapin sqlserverprovidersnapin100
cd SQLSERVER:\SQL\LOCALHOST\DEFAULT\Databases\SYSDB\Tables\dbo.STG0_EXPORT_JOBS 
$ds = Invoke-Sqlcmd -ServerInstance 'LOCALHOST' -Query "SELECT CASE WHEN SUBSTRING([EXPORT_NAME],1,3) = 'MHC' THEN SUBSTRING([EXPORT_NAME],5,(LEN([EXPORT_NAME])))+'.net' ELSE [EXPORT_NAME]+'.net' END AS export FROM [SYSDB].[dbo].[STG0_EXPORT_JOBS] WHERE [JOB_NAME] = 'MHC_STG0_MEMBERS'"
foreach ($files in $ds) {
    $oldestfile = Get-ChildItem C:\Scripts | 
        where{!$_.PSIsContainer -and $_.Name.EndsWith("$($files.export)")} | 
        sort-object -property name | select-object -first 1 Name | 
        Copy-Item "C:\Scripts\" + $oldestfile.substring(7,$oldestfile.length - 8) `
                   C:\Scripts\MEMBERS
 }

Вот что я получаю, когда запускаю это:

Windows PowerShell Copyright (C) 2009 Корпорация Microsoft. Все права защищены.

PS H:> C: \ powershell_MoveKoreFiles.ps1 Неожиданный токен «in» в выражении или утверждении. В C: \ powershell_MoveKoreFiles.ps1: 1 char: 472 + add-pssnapin sqlserverprovidersnapin100 add-pssnapin sqlservercmdletsnapin100 Set-Location SQLSERVER: \ SQL \ LOCALHOST \ DEFAULT \ Databases \ SYSDB \ Tables \ dbo.STG0_ EXPORT_JOBS $ ds = Invoke-Sqlcmd -Query "ВЫБРАТЬ СЛУЧАЙ, КОГДА ПОДПИСЫВАЕТСЯ ([EXPORT_NAME], 1,3) = 'MHC' THEN SUBSTRING ([EXPORT_NAME], 5, (LEN ([EXPORT_NAME]))) + '. Net' ELSE [ EXPORT_NAME] + '. Net' END AS экспорт из [SYSDB]. [Dbo]. [STG0_EXPORT_JOBS] WHERE [ JOB_NAME] = 'MHC_STG0_MEMBERS' "-ServerInstance" LOCALHOST "foreach ($ файлы в <<<< $ ds) {$ oldfile = Get-ChildItem C: \ Scripts |, где {! $ <em>.PSIsContainer -and $ .Name.EndsWith ("$ ($ files.export)")} | объект сортировки -имя свойства -сходящий | se lect-object -first 1 Name | Copy-Item -path "C: \ Scripts \" + $ oldfile.substring (7 , $ oldfile.length - 8) -destination C: \ Scripts \ MEMBERS} + CategoryInfo: ParserError: (in: String) [], ParseException + FullyQualifiedErrorId: UnexpectedToken

PS H:>

1 Ответ

0 голосов
/ 14 февраля 2010

Я думаю, что в сценарии может быть слишком много каналов. Удалите одно после имени «Выбрать первое имя», например ::1001

Add-PSSnapin sqlservercmdletsnapin100
Add-PSSnapin sqlserverprovidersnapin100
cd SQLSERVER:\SQL\LOCALHOST\DEFAULT\Databases\SYSDB\Tables\dbo.STG0_EXPORT_JOBS
$ds = Invoke-Sqlcmd -ServerInstance 'LOCALHOST' -Query "SELECT CASE WHEN " +
          "SUBSTRING([EXPORT_NAME],1,3) = 'MHC' THEN " +
          "SUBSTRING([EXPORT_NAME],5,(LEN([EXPORT_NAME])))+'.net' " +
          "ELSE [EXPORT_NAME]+'.net' END AS export " +
          "FROM [SYSDB].[dbo].[STG0_EXPORT_JOBS] " +
          "WHERE [JOB_NAME] = 'MHC_STG0_MEMBERS'" 
foreach ($files in $ds) 
{ 
    $oldestfile = Get-ChildItem C:\Scripts |  
        Where {!$_.PSIsContainer -and $_.Name.EndsWith("$($files.export)")} |
        Sort name | Select Name -First 1
    $oldName = "C:\Scripts\$($oldestfile.substring(7,$oldestfile.length - 8))" 
    Copy-Item $oldName C:\Scripts\MEMBERS 
}
...