3

我正在运行这个 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)
4

2 回答 2

3

您可以尝试在末尾添加:

$att.Dispose()
$msg.Dispose()
$smtp.Dispose()
于 2012-04-11T18:07:47.923 回答
1

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

于 2012-04-11T18:10:58.317 回答