Reputation: 77
I'm a beginner in Powershell, and I have a code that loop through PDF files get all their names. Then loop in an excel file for a match if true give the name of the site. here is a sample of my PDF Files, Excel File and Code explained, if you need any other explanation please tell me :
$filename = Get-childItem "T:\DVO\DVO-S\Activites\Gestion - Information clients\Base Installee\02-LOGISTIQUE\SB - TU\SB NORIA\FAIT BI\*" -Recurse | Where-Object {!$_.PSIsContainer}
$fil = '\\tm.corp\turbomeca\DVO\D2S-MRO\Activites\30-Noria\30-01 Activité\30-01-04 Plan de Progrès\2020-PDP\Fiches projet\44- simplification traitement des CoC Noria\extract pour projet gestion des CoC\Noria - Noria Search Advanced.xlsx'
$sheetName = "Noria - Noria Search Advanced"
$objExcel = New-Object -ComObject Excel.Application
$WorkBook = $objExcel.Workbooks.Open($fil)
$sheet = $WorkBook.worksheets.Item($sheetName)
$objExcel.visible = $false
$objExcel.DisplayAlerts = $false
$rowMax = ($Sheet.usedRange.rows).count
$RowNoria, $colNoria = 4,1 #Noria column
$RowNheSN,$colNheSN = 4,6 # NHESN column
$RowSite, $colSite = 4,29 #Site column
Here I want To get for every file the SN which is the bold part on this exemple of file name
$SN = 10074_292720384_C_2021.05.07.pdf (every thing before the first "underscore")
and then get the SB number which is
$SB = 10074_292720384_C_2021.05.07.pdf (3 last numbers of the number between "underscore"
I then tried to put the $SB in a way that can match the names in Noria column by doing this $SBF = "*_*$SB_*"
for ($i=0; $i -lt $filename.Count; $i++){
$F = $filename[$i].Name
$F
$SN = $F.split("_")[0]
$split = $F.split("_")[1]
$SB = -join $split[-3..-1]
$SBF = "*_*$SB_*"
In this loop I added a loop that is going to look for $SN in NHESN column and try to find that exact number and look for $SBF in the Noria column. If this two condition are met give me the SITE in the same Row
for($j=1; $j -le $rowMax-1; $j++){
$Noria = $sheet.cells.Item($RowNoria+$j, $colNoria).text
$NheSN = $sheet.cells.Item($RowNheSN+$j, $colNheSN).text
$Site = $sheet.cells.Item($RowSite+$j, $colSite).text
if ($Noria -like $SBF -and $NheSN -eq $SN) {
Write-Host ($Noria)
Write-Host ($Site)
write-Host ($NheSN)
Break
}
else {Continue}
}
As a Result I need This For exemple
and once i get it go to next file
But The result I get is Once it found a match in SN ($SN -eq $NHESN) it gave me the first row with that SN or NHESN but I want the row with the two condition for $SN -eq $NHESN and $SBF -eq $NORIA to be true The false result i get for exemple is
Thank you in advance for your time and help
And here is the all the code
$filename = Get-childItem "T:\DVO\DVO-S\Activites\Gestion - Information clients\Base Installee\02-LOGISTIQUE\SB - TU\SB NORIA\FAIT BI\*" -Recurse | Where-Object {!$_.PSIsContainer}
$fil = '\\tm.corp\turbomeca\DVO\D2S-MRO\Activites\30-Noria\30-01 Activité\30-01-04 Plan de Progrès\2020-PDP\Fiches projet\44- simplification traitement des CoC Noria\extract pour projet gestion des CoC\Noria - Noria Search Advanced.xlsx'
$sheetName = "Noria - Noria Search Advanced"
$objExcel = New-Object -ComObject Excel.Application
$WorkBook = $objExcel.Workbooks.Open($fil)
$sheet = $WorkBook.worksheets.Item($sheetName)
$objExcel.visible = $false
$objExcel.DisplayAlerts = $false
$rowMax = ($Sheet.usedRange.rows).count
$RowNoria, $colNoria = 4,1
$RowNheSN,$colNheSN = 4,6
$RowSite, $colSite = 4,29
for ($i=0; $i -lt $filename.Count; $i++){
$F = $filename[$i].Name
$F
$SN = $F.split("_")[0]
$split = $F.split("_")[1]
$SB = -join $split[-3..-1]
$SBF = "*_*$SB_*"
for($j=1; $j -le $rowMax-1; $j++){
$Noria = $sheet.cells.Item($RowNoria+$j, $colNoria).text
$NheSN = $sheet.cells.Item($RowNheSN+$j, $colNheSN).text
$Site = $sheet.cells.Item($RowSite+$j, $colSite).text
if ($Noria -like $SBF -and $NheSN -eq $SN) {
Write-Host ($Noria)
Write-Host ($Site)
write-Host ($NheSN)
Break
}
else {Continue}
}
}
$objExcel.quit()
Upvotes: 2
Views: 11673
Reputation: 5351
_
is a valid character for variable names, so $SBF is getting set incorrectly on this line:
$SBF = "*_*$SB_*"
Use a backtick to escape it:
$SBF = "*_*$SB`_*"
Upvotes: 2