【问题标题】:Powershell filter files by SQL Server result set and copyPowershell 按 SQL Server 结果集筛选文件并复制
【发布时间】:2010-02-12 00:03:00
【问题描述】:

我正在 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 版权所有 (C) 2009 Microsoft Corporation。保留所有权利。

PS H:> C:\powershell_MoveKoreFiles.ps1 表达式或语句中出现意外的标记“in”。 在 C:\powershell_MoveKoreFiles.ps1:1 char:472 + 添加-pssnapin sqlserverprovidersnapin100 添加-pssnapin sqlservercmdletsnapin100 设置位置 SQLSERVER:\SQL\LOCALHOST\DEFAULT\Databases\SYSDB\Tables\dbo.STG0_ EXPORT_JOBS $ds=Invoke-Sqlcmd -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'" -ServerInstance "LOCALHOST" foreach ($files in .PSIsContainer -and $.Name.EndsWith("$($files.export)")}|sort-object -property name -descending|se lect-object -first 1 名称|复制项 -path "C:\Scripts\"+$oldestfile.substring(7 ,$oldestfile.length - 8) -destination C:\Scripts\MEMBERS} + CategoryInfo : ParserError: (in:String) [], ParseException + FullyQualifiedErrorId : UnexpectedToken

PS H:>

【问题讨论】:

  • $files.GetType() 在 foreach 循环中返回什么?
  • 它为每一行返回以下内容,但整个结果集不适合这里。 PS SQLSERVER:\SQL\LOCALHOST\DEFAULT\Databases\SYSDB\Tables\dbo.STG0_EXPORT_JOBS> foreach ($files in $ds){$files.GetType()} IsPublic IsSerial Name BaseType -------- -- ------ ---- -------- True False DataRow System.Object
  • 嗯,很奇怪。当您尝试 foreach ($files in $ds){$files.GetType()} 时它可以工作,但是当您尝试问题中的代码时,它会返回 Unexpected token 'in' in expression or statement.?
  • 如果您尝试像 $ds | % { $file=$_; ... 那样通过管道传输会发生什么
  • 不要尝试将其作为单行执行(如 char 472 所示)。在您的脚本文件中,使用多行,如上所示。如果您真的想将其放在一行中,请使用; 分隔不同的语句。

标签: powershell foreach copy-item


【解决方案1】:

我认为脚本中的管道可能过多。删除 Select -first 1 Name 后面的那个,例如:

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 
}

【讨论】:

    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多