问题描述
我想做的是将$ sContractNumbers变量传递给我下面的循环,该循环基本上根据SQL查询将两个csv文件组合在一起。
我正在使用以下代码块从excel电子表格中获取值。某些内容将由其他用户更新。该单元格将始终是静态的,但是该单元格中的数据将更改大小,因此我必须使用IN子句。
我的变量值看起来像这样。
$ sContractNumbers ='abc123','abc456','abc789','abc112','abc345'
$xl = New-Object -COM "Excel.Application"
$xl.Visible = $true
$wb = $xl.Workbooks.Open("C:\Dev\Blah\ManualContracts.xlsx")
$ws = $wb.Sheets.Item(1)
#Looking up a value in one column and assigning the corresponding value from another column to a variable Could be done like this:
for ($i = 0; $i -le 1; $i++) {
if ( $ws.Cells.Item(1,2).Text -eq $ColumnHeader ) {
$i = $i++;
$sContractNumbers = $ws.Cells.Item(2,2).Value
#$sContractNumber
break
}
}
$wb.Close()
$xl.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)
$sContractNumbers
当前出现的错误如下。我不认为该循环会影响该变量。我尝试使用AddWithValue,但我认为我没有正确放置它,因此未列出它。对Powershell来说还很新,但是对T-sql有所了解。我认为这是一个简单的问题,但是由于我是菜鸟,所以我无法完全理解需要纠正的内容。保持温柔...
$DetailContent[1] = "{0}`r`n{1}" -f $HeadeDetail,$DetailContent[1]
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Cannot index into a null array.
Function Run-Query
{
param([string[]]$queries,[string[]]$sheetnames)
Begin
{
$sqlServer = 'server'
$Database = 'warehouse'
$sqlConnection = New-Object System.Data.sqlClient.sqlConnection
$sqlConnection.ConnectionString = "Server = $sqlServer; Database = $Database; Integrated Security = True"
$FileNameDate = Get-Date -f 'yyyyMMdd'
}#End Begin
Process
{
# Loop through each query
For($i = 0; $i -lt $queries.count; $i++)
{
$sqlCmd = New-Object System.Data.sqlClient.sqlCommand
$sqlCmd.CommandText = $queries[$i]
$sqlCmd.Connection = $sqlConnection
$sqlAdapter = New-Object System.Data.sqlClient.sqlDataAdapter
$sqlAdapter.SelectCommand = $sqlCmd
$DataSet = New-Object System.Data.DataSet
$sqlAdapter.Fill($DataSet)
$DataSet.Tables[0] | Export-CSV -NoTypeinformation -Path "C:\Dev\blah\HeaderDetail\$($sheetnames[$i])_$FileNameDate-000.csv" -Delimiter '|'
}
}#End Process
End
{
$sqlConnection.Close()
}
}#End function run-query.
$queries = @()
$queries += @'
SET NOCOUNT ON
SET ANSI_WARNINGS OFF
/*FE Header*/
SELECT [sContractNumber] as ContractNumber,into #Temp
FROM C
INNER JOIN D ON C.Id=D.iId
WHERE c.sContractNumber in ('$sContractNumbers')
order by sContractNumber
declare @TotalNewContracts int = 0
declare @TotalCanContracts int = 0
declare @TotalExpcontracts int = 0
set @TotalNewContracts = (select COUNT(fe.ContractNumber) from #temp fe where Record_Type = 'P')
set @TotalCanContracts = (select COUNT(fe.ContractNumber) from #temp fe where Record_Type = 'C')
select
count(contractnumber) as 'Total Number of All Contracts',FROM #temp ;
drop table #Temp;
'@
$queries += @'
SET NOCOUNT ON
SET ANSI_WARNINGS OFF
/*FE Header*/
SELECT [sContractNumber] as ContractNumber,into #Table
FROM [pcmi_warranty_custom_twsi].[dbo].[Contract_Header] C
INNER JOIN [pcmi_warranty_custom_twsi].[dbo].[Dealer_Header] D ON C.iDealerId=D.iId
WHERE c.sContractNumber in ('$sContractNumbers')
order by sContractNumber
SELECT ContractNumber,FROM #temp FE;
drop table #Temp;
'@
$sheetnames = @()
$sheetnames += 'Header'
$sheetnames += 'Details'
#FileName
$FileNameDate = Get-Date -f 'yyyyMMdd'
Run-Query -queries $queries -sheetnames $sheetnames
#Removes Double Quotes from File
(Get-Content C:\Dev\blah\HeaderDetail\Header_$FileNameDate-000.csv) | % {$_ -replace '"',''} | out-file -FilePath C:\Dev\blah\Header\Header_$FileNameDate-000.csv -Force -Encoding ascii
(Get-Content C:\Dev\blah\HeaderDetail\Details_$FileNameDate-000.csv) | % {$_ -replace '"',''} | out-file -FilePath C:\Dev\blah\Detail\Details_$FileNameDate-000.csv -Force -Encoding ascii
#Add Double Pipes as Delimter
(Get-Content C:\Dev\blah\Header\Header_$FileNameDate-000.csv) | % {$_ -replace "\|","||"} | out-file -FilePath C:\Dev\blah\Header\Header_$FileNameDate-000.csv -Force -Encoding ascii
(Get-Content C:\Dev\blah\Detail\Details_$FileNameDate-000.csv) | % {$_ -replace "\|","||"} | out-file -FilePath C:\Dev\blah\Detail\Details_$FileNameDate-000.csv -Force -Encoding ascii
#Add Header Detail Row to Detail File
#Header Path
$HeaderPath = "C:\Dev\blah\Header\Header_$FileNameDate-000.csv"
#Detail Path
$DetailsPath = "C:\Dev\blah\Detail\Details_$FileNameDate-000.csv"
#Gets second row of header file and sets it as a varaible
$HeadeDetail = Get-Content $HeaderPath -TotalCount 2 | Select-Object -Last 1;
#print the header detail row
$HeadeDetail
#Get Detail File content
$DetailContent = Get-Content -Path $DetailsPath
#Add Header Detail row to Detail file
$DetailContent[1] = "{0}`r`n{1}" -f $HeadeDetail,$DetailContent[1]
#Save Detail File
$DetailContent | Set-Content "C:\Dev\blah\blah$FileNameDate-000.csv" -Force -Encoding ascii
#Set the file name
$SourceFile = "C:\Dev\blah\blah$FileNameDate-000.csv"
$DestinationFolder = 'C:\Dev\blah'
$HeaderFile = "C:\Dev\blah\Header\Header_$FileNameDate-000.csv"
$DetailFile = "C:\Dev\blah\Detail\Details_$FileNameDate-000.csv"
$HDestinationFolder = 'C:\Dev\blah\Header'
$DDestinationFolder = 'C:\Dev\blah\Detail'
if (Test-Path $SourceFile)
{
$latest = Get-ChildItem -Path $DestinationFolder| sort-object Name -Descending | Select-Object -First 1
#split the latest filename,increment the number,then re-assemble new filename:
$newFileName = $latest.BaseName.Split('-')[0] + "-" + ([int]$latest.BaseName.Split('-')[1] + 1).ToString().PadLeft(3,"0") + $latest.Extension
Move-Item -path $SourceFile -destination $DestinationFolder"\"$newFileName
}
if (Test-Path $HeaderFile)
{
$latest = Get-ChildItem -Path $HDestinationFolder| sort-object Name -Descending | Select-Object -First 1
#split the latest filename,"0") + $latest.Extension
Move-Item -path $HeaderFile -destination $HDestinationFolder"\"$newFileName
}
if (Test-Path $DetailFile)
{
$latest = Get-ChildItem -Path $DDestinationFolder| sort-object Name -Descending | Select-Object -First 1
#split the latest filename,"0") + $latest.Extension
Move-Item -path $DetailFile -destination $DDestinationFolder"\"$newFileName
}
#Creates backup folder with corresponding date and places the file
$FolderName = Get-Date -f 'MMdd'
$FolderToCreate = "C:\Dev\blah\$FolderName"
if (!(Test-Path $FolderToCreate -PathType Container)) {
New-Item -ItemType Directory -Force -Path $FolderToCreate
}
copy-Item -Path "$DestinationFolder\TWFE*.csv" -Destination $FoldertoCreate -force;
$ODrive = 'O:\blah\blah\blah'
$FolderTocopy = "O:\blah\blah\blah\$FolderName"
$LatestFile = Get-ChildItem -Path "$DestinationFolder\$FolderName" -Name TWFE*.csv | sort-object -Descending | Select-Object -First 1
if (!(Test-Path $FolderTocopy -PathType Container)) {
copy-Item -Path "$DestinationFolder\$FolderName" -Destination $FolderTocopy -Recurse -Force -ErrorAction Continue
}
if ((Test-Path $FolderTocopy -PathType Container)) {
copy-Item -Path $LatestFile -Destination $FolderTocopy -Recurse -Force -ErrorAction Continue
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)