PowerShell — Добавьте имя файла в список столбцов, которые будут импортированы в SQL Server

#sql-server #powershell

Вопрос:

Я пытаюсь импортировать электронную таблицу, содержащую несколько столбцов, но я также хотел бы получить имя файла Excel, которое будет добавлено в список столбцов, которые будут импортированы в MS SQL Server.

Прямо сейчас — приведенный ниже код выбирает нужные мне столбцы из электронной таблицы и импортирует их в таблицу. Но то, что я хотел бы сделать, это захватить имя файла и включить его в импорт в именованный столбец BatchFileName .

В конце концов, я хочу изменить это, чтобы просмотреть папку и загрузить любую найденную электронную таблицу, но для начала я хотел сначала посмотреть, возможно ли это. Я попытался добавить переменную в Select-объект, но это не сработало. И на данный момент у меня нет никаких других идей.

Возможно ли это? И если да, то как бы этого добиться?

 $FileDirectory = "C:QualityReport"
$FileName = "QualityReport05142021.xlsx"    
$BatchFileName = -JOIN ($FileDirectory,$FileName)    
Write-Host $BatchFileName    
$SQLInstance = "localhost"
$Database = "GenericDB"    
$data = Import-Excel -Path $ImportFile -WorksheetName "Sorted" | Select-Object "IP","Network","DNS","NetBIOS","Tracking Method","OS","IP Status","QID","Title","Vuln Status","Type","Severity","Port","Protocol","FQDN","SSL"    
#Write-Host $data   
Write-DbaDataTable -SqlInstance $SQLInstance -Database $Database -Table "dbo.QualityReport" -InputObject $data -Truncate
 

Комментарии:

1. Если вы делаете это вручную, почему бы не создать столбец в файле Excel и не избежать сложностей? support.microsoft.com/en-us/office/…

2. Конечная цель-не ручной процесс, а сбор файлов, сохраненных на сетевом диске, и выполнение этой операции.

3. Это должно дать вам дополнительный толчок: github.com/dfinke/ImportExcel/blob/master/mdhelp/en/…

Ответ №1:

PowerShell поддерживает вычисляемые свойства во многих командлетах.

Вы можете изменить следующую строку (завернутую для ясности):

 $data = Import-Excel -Path $ImportFile -WorksheetName "Sorted" `
  | Select-Object "IP","Network","DNS","NetBIOS","Tracking Method","OS","IP Status","QID","Title","Vuln Status","Type","Severity","Port","Protocol","FQDN","SSL"    
 

К чему-то вроде этого:

 $data = Import-Excel -Path $ImportFile -WorksheetName "Sorted" `
  | Select-Object @{Name="BatchFileName";Expression={$ImportFile}},"IP","Network","DNS","NetBIOS","Tracking Method","OS","IP Status","QID","Title","Vuln Status","Type","Severity","Port","Protocol","FQDN","SSL"    
 

Комментарии:

1. Я полагаю, что предпочтительнее сделать обратный отсчет, чтобы у вас была труба в начале следующей строки. Решил, что я бы указал оператору, что символ канала ( | ) можно использовать в качестве символа продолжения, например [...] -WorksheetName "Sorted" | <new line> Select-Object [...]