我很難想出解決方案來比較兩個串列中匹配對的 LineNumbers。我將通過示例向您展示我的意思。
我有一個 SQL 腳本,我在其中將一些資料插入到現有表中。為了確保腳本的可重復性,在每次插入之前,我都會使用“delete”陳述句洗掉表的先前內容。我能夠決議檔案并檢查檔案中是否每個“插入database1.table1”也有“delete from database1.table1”。但我不知道如何檢查特定表的洗掉陳述句是否在插入陳述句之前(您需要在將新資料加載到表之前洗掉表的內容)。我想我需要使用 LineNumber 屬性,但我真的不知道如何將它與 database.table 檢查結合起來。
這是我用這個命令進入第一個變數的:
$insertinto = Get-ChildItem "$packagepath\Init\" -Include 03_Init_*.txt -Recurse | Select-String -Pattern "insert into "
#content of variable
C:\Users\hanus\Documents\sql_init.txt:42:insert into database1.table1
C:\Users\hanus\Documents\sql_init.txt:130:insert into database1.table2
C:\Users\hanus\Documents\sql_init.txt:282:insert into database2.table3
這是我使用此命令進入第二個變數的內容:
$deletefrom = Get-ChildItem "$packagepath\Init\" -Include 03_Init_*.txt -Recurse | Select-String -Pattern "delete from "
#content of the variable
C:\Users\hanus\Documents\sql_init.txt:40:delete from database1.table1;
C:\Users\hanus\Documents\sql_init.txt:128:delete from database1.table2;
C:\Users\hanus\Documents\sql_init.txt:280:delete from database2.table3;
預期的輸出類似于:這個“delete from”陳述句不在“insert into”陳述句之前,即使它在檔案中。
我希望我很好地描述了這個問題。我是 Powershell 和腳本的新手,所以請耐心等待。感謝您提前提供任何幫助!
uj5u.com熱心網友回復:
您已經在使用Select-String,所以這應該很簡單。這些變數的內容遠比你看到的要多。運行這個:
$deletefrom | Format-List * -Force
您會看到每個匹配項都包含一個物件,該物件具有匹配項來自哪個檔案、找到匹配項的行號等等的屬性。我認為,如果您捕獲正在修改的表并Select-String查看您現在正在搜索的內容,您可以對其進行分組,然后在插入后發生洗掉的時間發出警報。
Get-ChildItem "$packagepath\Init\*" -Include 03_Init_*.txt -Recurse |
Select-String "(?<=delete from |insert into )([^;] )" |
Group-Object {$_.Matches[0].value} |
ForEach-Object {
if($_.group[0] -notmatch 'delete from'){Write-Warning "Inserting into $($_.Name) before deleting"}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/529124.html
標籤:sql电源外壳前锋相比
