2010-02-12 6 views
0

J'exécute une requête dans SQL Server et renvoie un jeu de résultats de colonne unique. Je dois faire une boucle dans le jeu de résultats et trouver les noms de fichiers correspondant à l'enregistrement du jeu de résultats. Une partie du nom de fichier est un numéro de séquence. J'ai besoin de trier les fichiers dans l'ordre croissant, sélectionnez le premier fichier, puis copiez uniquement ce fichier dans un sous-répertoire. Les enregistrements du jeu de résultats ressembler à ceci:Fichiers de filtre Powershell par jeu de résultats SQL Server et copie

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

Les noms de fichiers ont ce genre de structure:

00_1914330_MEMBERS.net

Quelqu'un peut-il me dire pourquoi cela ne permet pas d'atteindre mon résultat final?

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 
} 

Voici ce que je reçois quand je lance ceci:

Windows PowerShell Copyright (C) 2009 Microsoft Corporation. Tous les droits sont réservés. PS:> C: \ powershell_MoveKoreFiles.ps1 Jeton inattendu 'in' dans une expression ou une instruction. C: \ powershell_MoveKoreFiles.ps1: 1 Caractère: 472 + add-pssnapin sqlserverprovidersnapin100 add-pssnapin sqlservercmdletsnapin100 Set-Location SQLServer: \ SQL \ LOCALHOST \ DEFAULT \ Databases \ SysDB \ Tables \ dbo.STG0_ EXPORT_JOBS $ ds = Invoke-Sqlcmd -Query "SELECT CASE SUBSTRING ([EXPORT_NAME], 1,3) = 'MHC' ALORS SUBSTRING ([EXPORT_NAME], 5, (LEN ([EXPORT_NAME]))) + '. Net' SINON [ nom_exportation] + 'net' END AS exporter à partir de [SysDB]. [dbo]. [STG0_EXPORT_JOBS] où [ JOB_NAME] « -ServerInstance "LOCALHOST" 'MHC_STG0_MEMBERS' = foreach (fichiers $ dans < < < < $ ds) {$ olderfile = Obtenir-ChildItem C: \ Scripts | où {! $ .PSIsContainer -et $ .Name.EndsWith ("$ ($ files.export)")} | trier-objet -property name -descending | se lect-object -first 1 Nom | Copier-Item -path "C: \ Scripts \ « + $ oldestfile.substring (7 , oldestfile.length $ - 8) -destination C: \ Scripts \ MEMBRES} + CategoryInfo: ParserError: (en: String) [], ParseException + FullyQualifiedErrorId: UnexpectedToken

PS H:>

+0

Que retourne-t-il dans la boucle foreach pour '$ files.GetType()'? – stej

+0

Il retourne le dessous pour chaque ligne, mais l'ensemble des résultats ne correspondrait pas ici. PS SQLServer: \ SQL \ LOCALHOST \ DEFAULT \ Bases de données \ SysDB \ Tables \ dbo.STG0_EXPORT_JOBS> foreach (fichiers $ en $ ds) {files.GetType $()} IsPublic IsSerial Nom BaseType ---- ------------ ---- -------- True False DataRow System.Object – stittdba

+0

Hm, c'est étrange. Lorsque vous essayez 'foreach ($ files dans $ ds) {$ files.GetType()}' cela fonctionne mais quand vous essayez le code dans votre question, il renvoie * Jeton inattendu 'in' dans l'expression ou la déclaration. *? – stej

Répondre

0

Je pense qu'il pourrait y avoir un trop de tuyaux dans le script. Enlevez celui qui se trouve après le Select -first 1 Name par exemple:

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 
}