【发布时间】:2018-05-18 17:07:38
【问题描述】:
我创建了一个脚本来从 CSV 文件构建 SQL 查询文件。当我在 ISE 中运行它时,它可以正常工作并完全按照我的预期构建文件。但是,如果我尝试从 powershell 或 cmd 会话启动脚本,则会收到错误消息:
Out-File : The process cannot access the file
'C:\Users\user.name\Documents\Working\terrorist525.sql' because it is
being used by another process.
脚本如下:
$start | out-file -filepath $target1 -append
$infile = $source1
$reader = [System.IO.File]::OpenText($infile)
$writer = New-Object System.IO.StreamWriter $file1;
$counter = 1
try {
while (($line = $reader.ReadLine()) -ne $null)
{
$myarray=$line -split "\t" | foreach {$_.Trim()}
if ($myarray[0] -Match "\d{1,4}\.\d{1,3}" -and $myarray[1] -ne {$null}){
$myarray[1] = $myarray[1] -replace "'","''"
$myarray[2] = $myarray[2] -replace "'","''"
$myarray[3] = $myarray[3] -replace "'","''"
$myarray[4] = $myarray[4] -replace "'","''"
$myarray[5] = $myarray[5] -replace "'","''"
"Insert into #terrorist Select convert(varchar(60),replace('OSFI Name: "+$myarray[1],$myarray[2],$myarray[3],$myarray[4],$myarray[5]+,"','''''','''')), no_,branch,name,surname,midname,usual,bname2 " | Out-File -filepath $target1 -append -force
If ($myarray[1] -eq "") {$myarray[1]=”~”}
If ($myarray[2] -eq "") {$myarray[2]=”~”}
If ($myarray[3] -eq "") {$myarray[3]=”~”}
If ($myarray[4] -eq "") {$myarray[4]=”~”}
If ($myarray[5] -eq "") {$myarray[5]=”~”}
"from cust where cust.surname in ('"+$myarray[2]+,"','"+$myarray[1]+,"','"+$myarray[3]+,"','"+$myarray[4]+,"','"+$myarray[5]+,"') and ( name in ('"+$myarray[1]+,"', '"+$myarray[2]+,"', '"+$myarray[3]+,"', '"+$myarray[4]+,"', '"+$myarray[5]+,"') or
midname in ('"+$myarray[1]+,"', '"+$myarray[2]+,"', '"+$myarray[3]+,"', '"+$myarray[4]+,"', '"+$myarray[5]+,"') or
usual in ('"+$myarray[1]+,"', '"+$myarray[2]+,"', '"+$myarray[3]+,"', '"+$myarray[4]+,"', '"+$myarray[5]+,"') or
bname2 in ('"+$myarray[1]+,"', '"+$myarray[2]+,"', '"+$myarray[3]+,"', '"+$myarray[4]+,"', '"+$myarray[5]+,"') )
go" | Out-File -filepath $target1 -append -force
}
#$writer.WriteLine($original);
#Write-Output $original;
#Write-Output $newlin
}
}
finally {
$reader.Close()
$writer.Close()
}
$end1 | Out-File -filepath $target1 -append
(GC $target1).replace("?","") | Set-Content $target1
运行$start | add-content -path $target1时似乎out-file没有放开文件
我读到的所有内容都表明情况不应该如此。
【问题讨论】:
-
Out-File不锁定文件。*-Contentcmdlet 可以。 -
这是我读过的内容,但我的脚本在除 ISE 之外的任何地方运行时仍会锁定文件
-
关闭并重新打开 ISE,然后再次测试。普通控制台和 ISE 之间的唯一区别应该是您定义的预先存在的东西。
-
如果您发布的示例中的第一行有错误,那么该行之前的
$target1文件会发生什么情况。似乎我们缺少具有实际错误的代码的上下文。第一行之前的那一行有Out-File吗? -
@JacobColvin 虽然我同意让他们关闭 ISE,然后重试,但控制台和 ISE 之间的唯一区别在于会话持久性是不正确的。至少 ISE 在 STA 中运行(默认情况下),而控制台在 MTA 中运行。差异是微妙的,很少的,但它们是存在的。
标签: file powershell out powershell-ise