2009-05-12 9 views
55

Tengo algunos archivos por lotes que utilizo para ayudar a automatizar el proceso de creación y recarga de bases de datos de desarrollo. Tiene sentido crear y mantener estos archivos por lotes en Visual Studio (es decir, en un proyecto VS Database). Se ven bastante simple, como esto:Visual Studio inserta caracteres no válidos en archivos por lotes

@echo off 
echo Setting server and db from defaults. 
set SERVERNAME=(LOCAL) 
set DB=PLEDGES 
echo Creating tables on server %SERVERNAME% and database %DB% 
sqlcmd -S %SERVERNAME% -d %DB% -E -i DropAllTables.sql 
sqlcmd -S %SERVERNAME% -d %DB% -E -i dbo.UserType.Table.sql 
sqlcmd -S %SERVERNAME% -d %DB% -E -i dbo.RegisteredUser.Table.sql 
echo Done creating tables. 

El problema es que cuando les corro, esta es la salida:

C:\> 
'' is not recognized as an internal or external command, 
operable program or batch file. 
Creating tables on server (LOCAL) and database PLEDGES 
Done creating tables. 

En otras palabras, Visual Studio es de alguna manera la inserción de forma invisible un conjunto de caracteres que el procesador de comandos de Windows interpreta como un comando, es decir, "∩╗┐". Una búsqueda en Google no arrojó nada sobre esto. ¿Alguien más se ha topado con esto? Pensamientos en una solución?

Tengo una solución alternativa (simplemente agregue una línea en blanco al comienzo de cada archivo, y mostrará el error, pero de lo contrario funcionará bien), pero el lado retentivo del yo se molesta cada vez que ejecuta uno de estos archivos.

Respuesta

47

Lo que sucede es que VisualStudio está siendo inteligente y le oculta el hecho de que su archivo por lotes se ha guardado en una codificación de caracteres no ASCII (por ejemplo, su archivo es UTF-8 o alguna otra codificación no ASCII) .

Mi equipo de proyecto ha sido atrapado varias veces por esto (si los archivos se registran en CVS, hace que los archivos se vuelvan un desastre).

Tiendo a utilizar Notepad ++, mire la codificación en la esquina inferior derecha (debe decir que es ANSI), si necesita cambiarlo vaya al menú de formato y cambie el tipo y luego guárdelo.

¡Visual Studio debe verse idéntico, pero el tamaño del archivo debería reducirse a la mitad!

+0

Nota: La codificación se llama UTF-8, no se UTC-8 – Joey

+0

@Johannes, gracias por señalarlo, lo he corregido. –

+1

Gracias - Notepad ++ fue el consejo correcto. Es extraño que Visual Studio y cmd.exe no funcionen juntos en algo tan básico como un archivo de texto. Huh. –

75

Ray tiene razón cuando dice que el formato predeterminado de Visual Studio para texto es algo así como UTF-8. Aunque Notepad ++ es una excelente herramienta y la utilizo yo mismo, existe una alternativa que le permite a Visual Studio almacenar su archivo de texto en formato ASCII:

En VS2008, seleccione su archivo en el explorador de soluciones y elija Archivo. ..Guardar myfile.bat Como ...

En la flecha hacia abajo del botón Guardar, elija Guardar con codificación.

Al guardar en el cuadro de diálogo Opciones de guardado avanzadas, seleccione US-ASCII en la lista desplegable Codificación. Establezca los finales de línea según sea necesario o déjelo como Configuración actual.

+0

Eso es útil, gracias. –

+0

Gracias por mi primer insignia, me alegra estar de servicio. – jadusty

+0

esto me ha estado molestando desde hace unos meses. y la respuesta estuvo aquí así que todo el tiempo ... –

11

Otra manera de corregir esto desde dentro de Visual Studio es ...

  1. Haga clic derecho en el archivo en el Explorador de soluciones y seleccione 'Abrir con'
  2. Realice una de las "... con la codificación" opciones
  3. elegir US-ASCII en la lista de codificaciones
  4. Guardar el archivo

Ahora debe retener esa codificación seleccionada cuando cada vez que lo abres

0

Mientras que esto era útil en mi búsqueda para resolver el problema en Visual Basic, la solución es decirle a VB para utilizar la codificación ASCII, como se muestra a continuación:

Try 
     outFile = My.Computer.FileSystem.OpenTextFileWriter(myPath, True, System.Text.Encoding.ASCII) 
     outFile.WriteLine(macroText) 
     outFile.Close() 
Catch ex As Exception 
Cuestiones relacionadas