Invoke-sqlcmd意外行为

时间:2013-03-05 13:13:53

标签: sql-server-2008 powershell bcp

我正在使用invoke-sqlcmd来bcp出一个文件。 所有看起来都是鳍和花花公子,除非我在创建之前尝试删除文件。 然后在文件可用之前需要一段随机时间。 有什么想法吗?

错误的代码(当然,用你自己的值替换$ dir和$ sql_srv)

$dir = "\\srv-ocmr\d$\temp\" 
$sql_srv = "srv-ocmr\rec1ocm" 
if (test-path $($dir+"*.dat")) {remove-item $($dir+"*.dat") } # culprit line 
$str = $("bcp sysobjects out " + $dir + "so.dat -S" + $sql_srv + " -T -N " ) 
invoke-sqlcmd -ServerInstance $sql_srv  -Query "exec xp_cmdshell '$str' " -Database    master -Verbose 
while (-not (test-path $($dir+"*.dat"))) { 
    sleep -Seconds 1 
    test-path $($dir+"*.dat")
    } 

删除罪魁祸首,瞧,一切都像魅力一样:

$dir = "\\srv-ocmr\d$\temp\" 
$sql_srv = "srv-ocmr\rec1ocm" 
$str = $("bcp sysobjects out " + $dir + "so.dat -S" + $sql_srv + " -T -N " ) 
invoke-sqlcmd -ServerInstance $sql_srv  -Query "exec xp_cmdshell '$str' " -Database    master -Verbose 
while (-not (test-path $($dir+"*.dat"))) { 
    sleep -Seconds 1 
    test-path $($dir+"*.dat")
    } 

用cmd / c del替换remove-item不会改变任何东西,与使用本地目录而不是UNC相同。

1 个答案:

答案 0 :(得分:0)

你试过了吗?

Get-ChildItem -Path:$dir -Filter:'*.dat' | Remove-item -Force

我怀疑Test-Path和通配符发生了奇怪的情况。使用我发布的命令,它将使用管道。如果get-childitem没有找到任何文件,则remove-item将无声地执行任何操作。如果找到文件,Remove-Item将尝试以极端偏见删除它们。