Powershell使用文件? “被其他进程使用”

时间:2012-04-11 18:00:27

标签: sql file powershell csv smtp

我运行了这个powershell脚本。第一次运行它运行完美,第二次运行我得到.csv不能访问的错误“因为它正被另一个进程使用。任何想法脚本的哪一部分”抓住“文件和我怎么能让它最后放手呢?

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)

2 个答案:

答案 0 :(得分:3)

你可以尝试在最后添加:

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

答案 1 :(得分:1)

您也可以尝试使用像procmon这样的工具,看看脚本在获取文件锁定并且不释放它时会执行什么操作。此外,由于(假设)问题出在.csv文件中,您可以将其作为字节数组加载,而不是将其路径作为附件传递。这样文件应该只读一次而不是锁定。