通过引用数组 [Powershell] 保存 txt 文件列表

Save list of txt files through referencing array [Powershell]

我有一个包含一些名称 (table_names.txt) 的文件,其内容是:

ALL_Dog    
ALL_Cat   
ALL_Fish  

和另一个包含一些条目 (test.txt) 的文件,其内容包括上述名称,例如:

 INSERT INTO ALL_Dog VALUES (1,2,3)
 INSERT INTO ALL_Cat VALUES (2,3,4)
 INSERT INTO ALL_Fish VALUES (3,4,5)

我需要在 powershell 中编写一个 for 循环,在我的当前目录中创建三个单独的文件:ALL_Dog.txt 其内容为“INSERT INTO ALL_Dog VALUES (1,2,3)” , ALL_Cat.txt 其内容为“INSERT INTO ALL_Cat VALUES (2,3,4)”, ALL_Fish.txt 其内容为“INSERT INTO ALL_Fish VALUES (3,4,5 )"

这是我目前的情况:

[string[]]$tableNameArray = (Get-Content -Path '.\table_names.txt') | foreach {$_ + " VALUES"}

[string[]]$namingArray = (Get-Content -Path '.\table_names.txt') | foreach {$_}

For($i=0; $i -lt $tableNameArray.Length; $i++)
    
{Get-Content test.txt| Select-String -Pattern $tableNameArray[$i] -Encoding ASCII | Select-Object -ExpandProperty Line | Out-File -LiteralPath $namingArray[$i]}

我目前的问题是我无法将输出文件定义为 .txt 文件,所以我的输出文件只是“ALL_Dog”、“ALL_Cat”和“ALL_Fish".

我正在寻找的解决方案涉及迭代此 namingArray 以实际命名输出文件。

我觉得我真的很接近解决方案,非常感谢任何人对正确结果的帮助或指导。

如果我正确理解了这个问题,您想从一个包含特定 table 名称的文件中获取所有行,并使用这些行创建一个新的文本文件,并将 table 名称作为文件名,带有 .txt 扩展名,正确吗?

在那种情况下,我会做如下的事情:

$outputPath    = 'D:\Test'    # the folder where the output files should go
$inputNames    = 'D:\Test\table_names.txt'
$inputCommands = 'D:\Test\test.txt'

# make sure the table names from this file do not have leading or trailing whitespaces
$table_names = Get-Content -Path $inputNames | ForEach-Object { $_.Trim() }
$sqlCommands = Get-Content -Path $inputCommands

# loop through the table names
foreach ($table in $table_names) {
    # prepare the regex pattern \b (word boundary) means you are searching for a whole word
    $pattern = '\b{0}\b' -f [regex]::Escape($table)
    # construct the output file path and name
    $outFile = Join-Path -Path $outputPath -ChildPath ('{0}.txt' -f $table)
    # get the string(s) using the pattern and write the file
    ($sqlCommands | Select-String -Pattern $pattern).Line | Out-File -FilePath $outFile -Append
}