Pregunta

Necesito extraer y guardar un algunas tablas de una base de datos SQL remota utilizando BCP. Quisiera escribir un script de PowerShell para invocar BCP para cada tabla y guardar los datos. Hasta ahora tengo este script que crea los argumentos necesarios para el BCP. Sin embargo no puedo encontrar la manera de pasar los argumentos de BCP. Cada vez que ejecute la secuencia de comandos sólo muestra la ayuda BCP en su lugar. Esto debe ser algo muy fácil que no estoy recibiendo.

#commands bcp database.dbo.tablename out c:\temp\users.txt -N -t, -U uname -P pwd -S <servername>
$bcp_path = "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\bcp.exe"
$serverinfo =@{}
$serverinfo.add('table','database.dbo.tablename')
$serverinfo.add('uid','uname')
$serverinfo.add('pwd','pwd')
$serverinfo.add('server','servername')
$out_path= "c:\Temp\db\"
$args = "$($serverinfo['table']) out $($out_path)test.dat -N -t, -U $($serverinfo['uid']) -P $($serverinfo['pwd']) -S $($serverinfo['server'])"

#this is the part I can't figure out
& $bcp_path $args
¿Fue útil?

Solución

En primer lugar, $args es una variable automática; no se puede establecer que, por lo que cualquier línea como $args = foo no hará nada (incluso con el modo estricto en, aunque una queja habría sido agradable).

A continuación, solo salen de un solo argumento (la cadena) para el programa. I contiene espacios, pero están adecuadamente escapé o encerrados entre paréntesis, por lo que el programa sólo se ve un solo argumento.

Usted tendrá que utilizar una matriz de argumentos a un programa, en lugar de una sola cadena, si se desea almacenar en una variable de antemano. Y hay que nombrarlo algo diferente a $args:

$arguments = "$($serverinfo['table'])",
             'out',"$($out_path)test.dat",
             '-N','-t,',
             '-U',"$($serverinfo['uid'])",
             '-P',"$($serverinfo['pwd'])",
             '-S',"$($serverinfo['server'])"

& $bcp_path $arguments

O, lo que yo preferiría, en realidad, sólo tiene que escribirlo en una sola línea que se deshace de la mayor parte de la fealdad aquí:

$out_path = 'c:\Temp\db'
& $bcp_path $serverinfo['table'] out $out_path\test.dat -N '-t,' -U $serverinfo['uid'] -P $serverinfo['pwd'] -S $serverinfo['server']

Otros consejos

Algunas aplicaciones de línea de comandos que necesitan aceptar locos argumentos al estilo de Gangnam con barras, citas, comillas dobles, es igual, los dos puntos, guiones, un verdadero cóctel.

PowerShell, en mi experiencia, a veces simplemente no puede hacer frente. Así que escribir en un archivo .cmd y ejecutar que a partir de cmd.exe, así:

echo $("Running command: " + $commandLine);

$rnd = $(([string](Get-Random -Minimum 10000 -Maximum 99999999)) + ".cmd");
$commandFilePath = $(Join-Path -Path $env:TEMP -ChildPath $rnd);
echo $commandLine | Out-File -FilePath $commandFilePath -Encoding ascii;

& cmd.exe /c $commandFilePath

Asegúrese de que la salida como ASCII desde el default Unicode podría no jugar bonito con cmd.exe (que me ladró y mostró caracteres extraños en mi primer intento).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top