Powershell using file? "being used by another process"

I have this powershell script running. The first time it runs it runs flawlessly, the second time it runs i get the error that the .csv cannont be access "because it is being used by another process. Any idea which part of the script is "holding onto" the file and how i can make it let it go at the end?

clear
set-executionpolicy remotesigned
# change this to the directory that the script is sitting in
cd d:\directory

#############################################
# Saves usernames/accountNumbers into array # 
#    and creates sql file for writing to    #
#############################################


# This is the location of the text file containing accounts
$accountNumbers = (Get-Content input.txt) | Sort-Object
$accountID=0
$numAccounts = $accountNumbers.Count
$outString =$null
# the name of the sql file containing the query
$file = New-Item -ItemType file -name sql.sql -Force


###################################
# Load SqlServerProviderSnapin100 #
###################################

if (!(Get-PSSnapin | ?{$_.name -eq 'SqlServerProviderSnapin110'})) 
{ 
    if(Get-PSSnapin -registered | ?{$_.name -eq 'SqlServerProviderSnapin110'}) 
    { 
        add-pssnapin SqlServerProviderSnapin100
        Write-host SQL Server Provider Snapin Loaded
    } 
    else 
    { 
    } 
} 
else 
{ 
Write-host SQL Server Provider Snapin was already loaded
}  


#################################
# Load SqlServerCmdletSnapin100 #
#################################

if (!(Get-PSSnapin | ?{$_.name -eq 'SqlServerCmdletSnapin100'})) 
{ 
    if(Get-PSSnapin -registered | ?{$_.name -eq 'SqlServerCmdletSnapin100'}) 
    { 
        add-pssnapin SqlServerCmdletSnapin100
        Write-host SQL Server Cmdlet Snapin Loaded
    } 
    else 
    { 

    } 
} 
else 
{ 
    Write-host SQL Server CMDlet Snapin was already loaded
} 




####################
# Create SQL query #
####################

# This part of the query is COMPLETELY static. What is put in here will not change. It will usually end with either % or '
$outString = "SELECT stuff FROM table LIKE '%"
# Statement ends at '. loop adds in "xxx' or like 'xxx"
IF ($numAccounts -gt 0)
{
    For ($i =1; $i -le ($AccountNumbers.Count - 1); $i++)
    {
        $outString = $outstring + $AccountNumbers[$accountID]
        $outString = $outString + "' OR ca.accountnumber LIKE '"
        $accountID++
    }
    $outString = $outString + $AccountNumbers[$AccountNumbers.Count - 1] 
}
else
{
    $outString = $outString + $AccountNumbers
}
# This is the end of the query. This is also COMPLETELY static. usually starts with either % or '
$outString = $outString + "%'more sql stuff"
add-content $file $outString
Write-host Sql query dynamically written and saved to file



###########################
# Create CSV to email out #
###########################

#Make sure to point it to the correct input file (sql query made above) and correct output csv. 
Invoke-Sqlcmd -ServerInstance instance -Database database -Username username -Password password -InputFile sql.sql | Export-Csv -Path output.csv



####################################
# Email the CSV to selected people #
####################################

$emailFrom = "to"
$emailTo = "from"
$subject = "test"
$body = "test"
$smtpServer = "server"
# Point this to the correct csv created above
$filename = "output.csv"

$att = new-object Net.mail.attachment($filename)
$msg = new-object net.mail.mailmessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)

$msg.from = $emailFrom
$msg.to.add($emailto)
$msg.subject = $subject
$msg.body = $body
$msg.attachments.add($att)

$smtp.Send($msg)

Answers


Can you try to add at th end :

$att.Dispose()
$msg.Dispose()
$smtp.Dispose()

You could also try and use a tool like procmon and see what does the script do whenever it acquires a lock on the file and doesn't release it. Also, since (supposedly) the problem is with the .csv file, you could load it as byte array instead of passing it's path as an attachment. This way the file should be read once and not locked.


Need Your Help

How do I segue an image to another ViewController and display it within an ImageView?

swift image imageview segue viewcontroller

The following code allows the user to select an image from the gallery or to take a picture and displays it within the ViewController via ImageView. What I want to do here is to pass the image that...

Android emulator doesn't use Windows host file?

android dns android-emulator

m3 http://img245.imageshack.us/img245/461/65254534.jpg