0

我有一个包含数百行数据的 SQL 表。此表中的一列包含以纯文本形式存储在该列中的文本报告。

本质上,我需要遍历 SQL 中的每一行数据,并将每一行的报告列的内容输出到其自己的单独文本文件中,并使用从另一列中提取的唯一名称。

我正在尝试通过 PowerShell 完成此操作,但我似乎被挂断了。以下是我到目前为止所拥有的。

foreach ($i=0; $i -le $Reports.Count; $i++)
{
  $SDIR = "C:\harassmentreports"
  $FILENAME = $Reports | Select-Object FILENAME
  $FILETEXT = $Reports | Select-Object TEXT
  $NAME = "$SDIR\$FILENAME.txt"
  if (!([System.IO.File]::Exists($NAME))) {
    Out-File $NAME | Set-Content -Path $FULLFILE -Value $FILETEXT
  }
}
4

1 回答 1

0

假设这$Reports是您的 SQL 查询中的记录列表,您需要解决以下问题:

  • 在索引循环中使用对数组元素的索引访问:

    $FILENAME = $Reports[$i] | Select-Object FILENAME
    $FILETEXT = $Reports[$i] | Select-Object TEXT
  • 如果变量的值在循环内没有改变,则在循环外定义变量:

    $SDIR = "C:\harassmentreports"
    foreach ($i=0; $i -le $Reports.Count; $i++) {
      ...
    }
  • 如果要使用属性值,请展开属性:

    $FILENAME = $Reports[$i] | Select-Object -Expand FILENAME
    $FILETEXT = $Reports[$i] | Select-Object -Expand TEXT
  • 用于Join-Path构建路径:

    $NAME = Join-Path $SDIR "$FILENAME.txt"
    
  • 用于Test-Path检查文件或文件夹是否存在:

    if (-not (Test-Path -LiteralPath $NAME)) {
      ...
    }
    
  • 使用任一Out-File

    Out-File -FilePath $NAME -InputObject $TEXT
    

    或者Set-Content

    Out-File -Path $NAME -Value $TEXT
    

    不是他们两个。两个 cmdlet 之间的基本区别在于它们的默认编码。前者使用Unicode,后者使用ASCII编码。两者都允许您通过参数更改编码-Encoding

您可能还想首先重新考虑使用for循环。带有循环的管道ForEach-Object可能是更好的方法:

$SDIR = "C:\harassmentreports"
$Reports | ForEach-Object {
  $file = Join-Path $SDIR ($_.FILENAME + '.txt')
  if (-not (Test-Path $file)) { Set-Content -Path $file -Value $_.TEXT }
}
于 2016-08-29T21:03:22.227 回答