首页 > 解决方案 > 如何遍历表中的列值并通过powershell创建文件夹

问题描述

我正在尝试通过 powershell 实现以下目标:

我有一个包含 5 列的表(TBL_DDL)(CATALOG、SCHEMA、OBJECT_TYPE、OBJECT_NAME、DDL)

现在,我从该表中提取数据,然后尝试通过连接 C: 驱动器中的前 4 列(CATALOG、SCHEMA、OBJECT_TYPE、OBJECT_NAME)来创建文件夹结构,然后将数据导出到 txt 文件中的 DDL 列中。

例如:C:\"CATALOG"\"SCHEMA"\"OBJECT_TYPE"\"OBJECT_NAME"\DDL.txt

我正在尝试通过 powershell 来实现这一点。任何人都可以帮助我吗?

$SqlCmd = 'snowsql -c example -d tu_test -s public  -q "select catalog,schema,OBJECT_TYPE,OBJECT_NAME,DDL from SF_TBL_DDL limit 2"'
$MultiArray = @(Invoke-Expression $SqlCmd)
$dt = New-Object System.Data.Datatable
[void]$dt.Columns.Add("CATALOG")
[void]$dt.Columns.Add("SCHEMA")

$Output = foreach ($Object in $MultiArray)
        {
        foreach ($SCHEMA in $Object.SCHEMA) 
            {

            $someother = New-Object -TypeName psobject -Property @{CATALOG = $Object.CATALOG; SCHEMA = $SCHEMA}
            $nRow = $dt.NewRow()
            $nRow.CATALOG = $someother.CATALOG
            $nRow.SCHEMA = $someother.SCHEMA
            $dt.Rows.Add($nRow)
            }   
        }
$dt.row.count

目前,我在 $dt 中得到 0 行。干杯

标签: powershellpowershell-2.0powershell-3.0

解决方案


您可以使用 System.Data.DataTable 对象来拉取您的结果集,然后循环通过它来执行所需的操作。

此处 GetTableValues 函数将检索表值,然后使用以下 cmdlet 创建目录和文件

  New-Item -ItemType "directory" -Path $dirPath
  New-Item -ItemType "file" -Path $filePath

完整的代码如下所示

function GetTableValues(){
$DBConnectionString = "<Your DB connection string>";
$sqlConn = new-object System.Data.SqlClient.sqlConnection $DBConnectionString;
$sqlConn.Open();
$sqlCommand = $sqlConn.CreateCommand();
$sqlCommand.CommandText = "select catalog,[schema],OBJECT_TYPE,OBJECT_NAME,DDL from TBL_DDL"; ##Put your correct query here
$result = $sqlCommand.ExecuteReader();
$table = New-Object System.Data.DataTable;
$table.Load($result);
$sqlConn.Close();
return $table;
}

    $tableValue = GetTableValues;

    foreach ($Row in $tableValue)
    { 
      $filePath = "C:\" + $Row.catalog.TrimEnd() + "\" + $Row.schema.TrimEnd() + "\" + $Row.OBJECT_TYPE.TrimEnd() + "\" + $Row.OBJECT_NAME.TrimEnd() + "\" + $Row.DDL.TrimEnd() + ".txt" 
      $dirPath = "C:\" + $Row.catalog.TrimEnd() + "\" + $Row.schema.TrimEnd() + "\" + $Row.OBJECT_TYPE.TrimEnd() + "\" + $Row.OBJECT_NAME.TrimEnd()  
      New-Item -ItemType "directory" -Path $dirPath  ##Creates directory
      New-Item -ItemType "file" -Path $filePath  ##Creates file in $dirPath directory   
    }

这对我来说非常好。


推荐阅读