2013-03-05 3 views
0

J'utilise invoke-sqlcmd pour sortir un fichier bcp. Tout semble être des ailettes et dandy, sauf lorsque j'essaye de supprimer le fichier avant de le créer. Cela prend ensuite un temps aléatoire avant que le fichier ne soit disponible. Des idées pourquoi?Invoke-sqlcmd comportement inattendu

défectueux Code (ne remplacez $ dir et sql_srv $ avec vos propres valeurs, bien sûr)

$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") 
    } 

Retirez la ligne coupable, et le tour est joué, tout fonctionne comme un charme:

$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") 
    } 

Remplacer remove-item par cmd/c del ne change rien, la même chose en utilisant un répertoire local au lieu d'un UNC.

+0

Je ne parviens pas à reproduire le problème. Combien de temps cela prend-il avant que le fichier soit disponible? – Aryadev

+1

Pourquoi exécutez-vous PowerShell pour indiquer à SQL Server d'utiliser 'xp_cmdshell' pour exécuter une commande shell? Pourquoi ne pas simplement exécuter votre script via remote sur le serveur exécutant 'bcp' directement depuis PowerShell? – alroc

+0

Arya: il faut un temps aléatoire entre 4 et 15 secondes avant que le chemin de test évalue à vrai. – m1ghtyBear

Répondre

0

Avez-vous essayé:

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

Je soupçonnant oddness passe avec Test-Path et wildcards. Avec la commande que j'ai posté, il utilisera le pipeline. Si get-childitem ne trouve aucun fichier, remove-item ne fera rien en silence. Si des fichiers sont trouvés, Remove-Item essaiera de les supprimer avec un préjudice extrême.