Archivo por lotes - Batch file

Archivo por lotes
Archivo por lotes icon.png
Extensiones de nombre de archivo .bat, .cmd,.btm
Tipo de medio de Internet
Tipo de formato Scripting
Contenedor para Guiones

Un archivo por lotes es un archivo de secuencia de comandos en DOS , OS / 2 y Microsoft Windows . Consiste en una serie de comandos que debe ejecutar el intérprete de línea de comandos , almacenados en un archivo de texto sin formato . Un archivo por lotes puede contener cualquier comando del intérprete acepta de forma interactiva y construcciones de uso que permiten a la bifurcación condicional y bucles dentro del archivo por lotes, tales como IF, FORy GOTO etiquetas . El término "lote" proviene del procesamiento por lotes , que significa "ejecución no interactiva", aunque es posible que un archivo por lotes no procese un lote de varios datos.

Al igual que Job Control Language (JCL), DCL y otros sistemas en sistemas de mainframe y miniordenadores, se agregaron archivos por lotes para facilitar el trabajo requerido para ciertas tareas regulares al permitir al usuario configurar un script para automatizarlas. Cuando se ejecuta un archivo por lotes, el programa de shell (normalmente COMMAND.COM o cmd.exe ) lee el archivo y ejecuta sus comandos, normalmente línea por línea. Los sistemas operativos similares a Unix , como Linux , tienen un tipo de archivo similar, pero más flexible, llamado script de shell .

La extensión de nombre de archivo .bat se utiliza en DOS y Windows. Windows NT y OS / 2 también agregaron .cmd . Los archivos por lotes para otros entornos pueden tener diferentes extensiones, por ejemplo, .btm en shells relacionados con 4DOS , 4OS2 y 4NT .

El manejo detallado de archivos por lotes ha cambiado significativamente entre versiones. Algunos de los detalles de este artículo se aplican a todos los archivos por lotes, mientras que otros detalles se aplican solo a determinadas versiones.

Variantes

DOS

En DOS, se puede iniciar un archivo por lotes desde la interfaz de línea de comandos escribiendo su nombre, seguido de los parámetros requeridos y presionando la ↵ Entertecla. Cuando se carga DOS, el archivo AUTOEXEC.BAT , cuando está presente, se ejecuta automáticamente, por lo que cualquier comando que deba ejecutarse para configurar el entorno DOS puede colocarse en este archivo. Los usuarios de computadoras harían que el archivo AUTOEXEC.BAT configurara la fecha y hora del sistema, inicializara el entorno DOS, cargara los programas residentes o controladores de dispositivo o inicializara las conexiones y asignaciones de red.

Una extensión de nombre de archivo .bat identifica un archivo que contiene comandos que son ejecutados por el intérprete de comandos COMMAND.COM línea por línea, como si fuera una lista de comandos ingresados ​​manualmente, con algunos comandos adicionales específicos del archivo por lotes para la funcionalidad básica de programación, incluyendo un GOTOcomando para cambiar el flujo de ejecución de la línea.

Ventanas tempranas

Microsoft Windows se introdujo en 1985 como una superposición basada en interfaz gráfica de usuario (GUI) en sistemas operativos basados ​​en texto y fue diseñado para ejecutarse en DOS. Para iniciarlo, WINse utilizó el comando, que podría agregarse al final del archivo AUTOEXEC.BAT para permitir la carga automática de Windows. En las versiones anteriores, se podía ejecutar un archivo de tipo .bat desde Windows en el indicador de MS-DOS. Windows 3.1xy versiones anteriores, así como Windows 9x, invocaron COMMAND.COM para ejecutar archivos por lotes.

OS / 2

El sistema operativo IBM OS / 2 admitía archivos por lotes de estilo DOS. También incluía una versión de REXX , un lenguaje de secuencias de comandos de archivos por lotes más avanzado . IBM y Microsoft comenzaron a desarrollar este sistema, pero durante la construcción del mismo se rompieron después de una disputa; como resultado de esto, IBM se refirió a su shell de consola similar a DOS sin mencionar a Microsoft, nombrándolo simplemente DOS, aunque esto aparentemente no hizo ninguna diferencia con respecto a la forma en que funcionaban los archivos por lotes de COMMAND.COM.

El intérprete de archivos por lotes de OS / 2 también admite un comando EXTPROC. Esto pasa el archivo por lotes al programa nombrado en el archivo EXTPROC como un archivo de datos. El programa nombrado puede ser un archivo de secuencia de comandos; esto es similar al #! mecanismo.

Windows NT

A diferencia de Windows 98 y versiones anteriores, la familia de sistemas operativos Windows NT no depende de MS-DOS. Windows NT introdujo un intérprete de comandos mejorado de 32 bits ( cmd.exe ) que podía ejecutar scripts con la extensión .CMD o .BAT. Cmd.exe agregó comandos adicionales e implementó los existentes de una manera ligeramente diferente, de modo que el mismo archivo por lotes (con una extensión diferente) podría funcionar de manera diferente con cmd.exe y COMMAND.COM. En la mayoría de los casos, el funcionamiento es idéntico si no se utilizan los pocos comandos no compatibles. Las extensiones de Cmd.exe a COMMAND.COM se pueden deshabilitar por compatibilidad.

Microsoft lanzó una versión de cmd.exe para Windows 9x y ME llamada WIN95CMD para permitir a los usuarios de versiones anteriores de Windows usar ciertos archivos por lotes de estilo cmd.exe.

A partir de Windows 8, cmd.exe es el intérprete de comandos normal para archivos por lotes; el antiguo COMMAND.COM también se puede ejecutar en versiones de Windows de 32 bits capaces de ejecutar programas de 16 bits.

Extensiones de nombre de archivo

.murciélago
La primera extensión de nombre de archivo utilizada por Microsoft para archivos por lotes. Esta extensión se ejecuta con DOS y todas las versiones de Windows, bajo COMMAND.COM o cmd.exe, a pesar de las diferentes formas en que los dos intérpretes de comandos ejecutan archivos por lotes.
.cmd
Se utiliza para archivos por lotes en la familia de Windows NT y se envía a cmd.exe para su interpretación. COMMAND.COM no reconoce esta extensión de nombre de archivo, por lo que los scripts cmd.exe no se ejecutan por error en el entorno de Windows incorrecto. Además, append, dpath, ftype, set, path, assocy promptcomandos, cuando se ejecuta desde un archivo .bat, alteran el valor de la errorlevelvariable sólo a un error, mientras que dentro de un archivo .cmd, que afectarían a nivel de error incluso cuando regresan sin un error. También lo utiliza OS / 2 de IBM para archivos por lotes.
.btm
La extensión utilizada por 4DOS , 4OS2 , 4NT y Take Command . Estos scripts son más rápidos, especialmente con los más largos, ya que el script se carga completamente listo para su ejecución, en lugar de línea por línea.

Parámetros de archivo por lotes

COMMAND.COM y cmd.exe admiten que una serie de variables especiales ( %0, %1hasta %9) para hacer referencia a la ruta y el nombre del trabajo por lotes y los primeros nueve parámetros de llamada desde el trabajo por lotes, consulte también SHIFT. Los parámetros inexistentes se reemplazan por una cadena de longitud cero. Se pueden utilizar de forma similar a las variables de entorno , pero no se almacenan en el entorno. Microsoft e IBM se refieren a estas variables como parámetros de reemplazo o parámetros reemplazables , mientras que Digital Research, Novell y Caldera establecieron el término variables de reemplazo para ellas. JP Software los llama parámetros de archivo por lotes .

Ejemplos de

Este archivo por lotes de ejemplo muestra Hello World!, solicita y espera que el usuario presione una tecla y luego termina. (Nota: no importa si los comandos están en minúsculas o mayúsculas a menos que trabaje con variables)

@ECHO OFF
ECHO Hello World!
PAUSE

Para ejecutar el archivo, debe guardarse con el sufijo de extensión de nombre de archivo .bat (o .cmd para sistemas operativos de tipo Windows NT) en formato de texto sin formato, normalmente creado mediante un editor de texto como el Bloc de notas de Microsoft o un procesador de texto que funcione en modo de texto sin formato.

Cuando se ejecuta, se muestra lo siguiente:

Hello World!
Press any key to continue . . .

Explicación

El intérprete ejecuta cada línea por turno, comenzando por la primera. El @símbolo al comienzo de cualquier línea evita que el indicador muestre ese comando mientras se ejecuta. El comando ECHO OFFdesactiva el indicador de forma permanente o hasta que se vuelve a activar. La combinación @ECHO OFFes a menudo, como aquí, la primera línea de un archivo por lotes, lo que evita que se muestren los comandos, incluido él mismo. Luego se ejecuta la siguiente línea y sale el ECHO Hello World!comando Hello World!. Se ejecuta la siguiente línea y el PAUSEcomando muestra Press any key to continue . . .y pausa la ejecución del script. Después de presionar una tecla, el script termina, ya que no hay más comandos. En Windows, si la secuencia de comandos se ejecuta desde una ventana de símbolo del sistema que ya se está ejecutando , la ventana permanece abierta en el símbolo del sistema como en MS-DOS; de lo contrario, la ventana se cierra al finalizar.

Limitaciones y excepciones

Valores nulos en variables

Las expansiones de variables se sustituyen textualmente en el comando y, por lo tanto, las variables que no contienen nada simplemente desaparecen de la sintaxis, y las variables que contienen espacios se convierten en múltiples tokens. Esto puede provocar errores de sintaxis o errores.

Por ejemplo, si% foo% está vacío, esta declaración:

IF %foo%==bar ECHO Equal

analiza como la construcción errónea:

IF ==bar ECHO Equal

Del mismo modo, si %foo%contiene abc def, se produce un error de sintaxis diferente:

IF abc def==bar ECHO Equal

La forma habitual de evitar este problema es rodear las expansiones de variables entre comillas para que una variable vacía se expanda en la expresión válida en IF ""=="bar"lugar de la inválida IF ==bar. El texto que se está comparando con la variable también debe estar entre comillas, porque las comillas no son una sintaxis especial delimitadora; estos personajes se representan a sí mismos.

IF "%foo%"=="bar" ECHO Equal

El retrasado! VARIABLE! La expansión disponible en Windows 2000 y posterior se puede utilizar para evitar estos errores sintácticos. En este caso, las variables nulas o de varias palabras no fallan sintácticamente porque el valor se expande después de analizar el comando IF:

IF !foo!==bar ECHO Equal

Otra diferencia en Windows 2000 o superior es que una variable vacía (indefinida) no se sustituye. Como se describe en ejemplos anteriores, el comportamiento anterior del intérprete por lotes habría dado como resultado una cadena vacía. Ejemplo:

C:\>set MyVar=
C:\>echo %MyVar%
%MyVar%

C:\>if "%MyVar%"=="" (echo MyVar is not defined) else (echo MyVar is %MyVar%)
MyVar is %MyVar%

Los intérpretes por lotes anteriores a Windows 2000 habrían mostrado el resultado MyVar is not defined.

Comillas y espacios en cadenas pasadas

A diferencia de los procesos Unix / POSIX, que reciben sus argumentos de línea de comandos ya divididos por el shell en una matriz de cadenas, un proceso de Windows recibe la línea de comandos completa como una sola cadena, a través de la función API GetCommandLine . Como resultado, cada aplicación de Windows puede implementar su propio analizador para dividir toda la línea de comandos en argumentos. Muchas aplicaciones y herramientas de línea de comandos han desarrollado su propia sintaxis para hacer eso, por lo que no existe una convención única para citar o escapar de metacaracteres en las líneas de comando de Windows.

  • Para algunos comandos, los espacios se tratan como delimitadores que separan los argumentos, a menos que esos espacios estén entre comillas. Existen varias convenciones sobre cómo se pueden pasar las comillas a la aplicación:
    • El analizador de línea de comandos integrado en la biblioteca de tiempo de ejecución de Microsoft Visual C ++ en la función CommandLineToArgvW implementa una convención ampliamente utilizada . Utiliza la convención de que 2 n barras invertidas seguidas de una comilla (") producen n barras invertidas seguidas de una comilla inicial / final, mientras que (2 n ) +1 barras invertidas seguidas de una comilla vuelven a producir n barras invertidas seguidas de una comilla literal La misma convención es parte de la especificación de .NET Framework .
      • Un aspecto no documentado es que "" que aparece en medio de una cadena entre comillas produce una sola comilla. (Un cambio de CRT en 2008 [msvcr90] modificó este manejo no documentado de las comillas). Esto es útil para insertar comillas en un argumento sin volver a habilitar la interpretación de metacaracteres cmd como | , & y > . (cmd no reconoce el \ " habitual como un escape de la cita. Vuelve a habilitar estos significados especiales al ver la cita, pensando que la cita ha terminado).
    • Otra convención es que una comilla simple ( " ) no se incluye como parte de la cadena. Sin embargo, una comilla de escape ( " "" ) puede ser parte de la cadena.
    • Sin embargo, otra convención común proviene del uso de programas portados derivados de Cygwin . No distingue entre barras invertidas que aparecen antes o no antes de las comillas. Consulte glob (programación) § Windows y DOS para obtener información sobre estos analizadores alternativos de línea de comandos.
    • Algunos comandos importantes de Windows, como cmd.exey wscript.exe, usan sus propias reglas.
  • Para otros comandos, los espacios no se tratan como delimitadores y, por lo tanto, no necesitan comillas. Si se incluyen comillas, se convierten en parte de la cadena. Esto se aplica a algunos comandos integrados como echo .

Cuando una cadena contiene comillas y debe insertarse en otra línea de texto que también debe estar entre comillas, se requiere especial atención al mecanismo de comillas:

C:\>set foo="this string is enclosed in quotation marks"

C:\>echo "test 1 %foo%"
"test 1 "this string is enclosed in quotation marks""

C:\>eventcreate /T Warning /ID 1 /L System /SO "Source" /D "Example: %foo%"
ERROR: Invalid Argument/Option - 'string'.
Type "EVENTCREATE /?" for usage.

En Windows 2000 y versiones posteriores, la solución es reemplazar cada aparición de un carácter de comillas dentro de un valor por una serie de tres caracteres de comillas:

C:\>set foo="this string is enclosed in quotes"

C:\>set foo=%foo:"="""%

C:\>echo "test 1 %foo%"
"test 1 """this string is enclosed in quotes""""

C:\>eventcreate /T Warning /ID 1 /L System /SO "Source" /D "Example: %foo%"
SUCCESS: A 'Warning' type event is created in the 'Source' log/source.

Caracteres de escape en cadenas

Algunos caracteres, como los de barra vertical ( |), tienen un significado especial para la línea de comandos. No se pueden imprimir como texto usando el comando ECHO a menos que se hayan escapado usando el símbolo de intercalación ^:

C:\>Echo foo | bar
'bar' is not recognized as an internal or external command,
operable program or batch file.

C:\>Echo foo ^| bar
foo | bar

Sin embargo, el escape no funciona como se esperaba al insertar el carácter de escape en una variable de entorno. La variable termina conteniendo un comando de tubería en vivo cuando simplemente se repite. Es necesario escapar tanto del signo de intercalación como del carácter de escape para que el carácter se muestre como texto en la variable:

C:\>set foo=bar | baz
'baz' is not recognized as an internal or external command,
operable program or batch file.

C:\>set foo=bar ^| baz
C:\>echo %foo%
'baz' is not recognized as an internal or external command,
operable program or batch file.

C:\>set foo=bar ^^^| baz
C:\>echo %foo%
bar | baz

El retrasado ! VARIABLE! La expansión disponible con CMD /V:ONo con SETLOCAL ENABLEDELAYEDEXPANSIONWindows 2000 y posterior puede usarse para mostrar caracteres especiales almacenados en variables de entorno porque el valor de la variable se expande después de analizar el comando:

C:\>cmd /V:ON
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:\>set foo=bar ^| baz
C:\>echo !foo!
bar | baz

Retraso del sueño o del guión

Hasta que se introdujo el comando TIMEOUT con Windows Vista, no había una manera fácil de implementar una pausa programada, ya que el comando PAUSE detiene la actividad de la secuencia de comandos indefinidamente hasta que se presiona cualquier tecla.

Fueron posibles muchas soluciones, pero generalmente solo funcionaron en algunos entornos: el CHOICEcomando no estaba disponible en versiones anteriores de DOS, PINGsolo estaba disponible si estaba instalado TCP / IP, y así sucesivamente. Microsoft no ofrecía ninguna solución, pero se podían instalar varios pequeños programas de utilidad desde otras fuentes. Un ejemplo comercial sería el comando 1988 Norton Utilities Batch Enhancer (BE), donde BE DELAY 18esperaría 1 segundo, o el WAIT.COM gratuito de 94 bytes, donde WAIT 5esperaría 5 segundos y luego devolvería el control al script. La mayoría de estos programas son archivos .COM de 16 bits, por lo que son incompatibles con Windows de 64 bits.

Salida de texto con CR / LF despojado

Normalmente, todo el texto impreso tiene automáticamente los caracteres de control para el retorno de carro (CR) y el avance de línea (LF) al final de cada línea.

  • batchtest.bat
    @echo foo
    @echo bar
    
    C:\>batchtest.bat
    foo
    bar
    

No importa si los dos comandos echo comparten la misma línea de comandos; los códigos CR / LF se insertan para dividir la salida en líneas separadas:

C:\>@echo Message 1&@echo Message 2
Message 1
Message 2

Un truco descubierto con Windows 2000 y versiones posteriores es usar el indicador especial para ingresar texto y enviarlo sin CR / LF al final del texto. En este ejemplo, el CR / LF no sigue el Mensaje 1, pero sigue la Línea 2 y la Línea 3:

  • batchtest2.bat
    @echo off
    set /p ="Message 1"<nul
    echo Message 2
    echo Message 3
    
    C:\>batchtest2.bat
    Message 1Message 2
    Message 3
    

Esto se puede usar para enviar datos a un archivo de texto sin CR / LF adjunto al final:

C:\>set /p ="Message 1"<nul >data.txt
C:\>set /p ="Message 2"<nul >>data.txt
C:\>set /p ="Message 3"<nul >>data.txt
C:\>type data.txt
Message 1Message 2Message 3

Sin embargo, no hay forma de inyectar esta salida de solicitud CR / LF despojada directamente en una variable de entorno.

Establecer un directorio de trabajo de Convención de nomenclatura uniforme (UNC) desde un acceso directo

No es posible tener un símbolo del sistema que utilice una ruta UNC como directorio de trabajo actual; p.ej\\server\share\directory\

El símbolo del sistema requiere el uso de letras de unidad para asignar un directorio de trabajo, lo que dificulta la ejecución de archivos por lotes complejos almacenados en un servidor compartido UNC. Si bien un archivo por lotes se puede ejecutar desde una ruta de archivo UNC, el directorio de trabajo predeterminado es C:\Windows\System32\.

En Windows 2000 y versiones posteriores, una solución es utilizar el comando PUSHDy POPDcon extensiones de comando.

Si no está habilitado de forma predeterminada, las extensiones de comando se pueden habilitar temporalmente usando el /E:ONinterruptor para el intérprete de comando.

Por lo tanto, para ejecutar un archivo por lotes en un recurso compartido UNC, asigne una letra de unidad temporal al recurso compartido UNC y use el recurso compartido UNC como directorio de trabajo del archivo por lotes, se puede construir un acceso directo de Windows con este aspecto:

  • Objetivo: %COMSPEC% /E:ON /C "PUSHD """\\SERVER\SHARE\DIR1\DIR2\""" & BATCHFILE.BAT & POPD"

El atributo de directorio de trabajo de este acceso directo se ignora.

Esto también resuelve un problema relacionado con el Control de cuentas de usuario (UAC) en Windows Vista y versiones posteriores. Cuando un administrador inicia sesión y UAC está habilitado, e intenta ejecutar un archivo por lotes como administrador desde una letra de unidad de red, utilizando el menú contextual del archivo del botón derecho, la operación fallará inesperadamente. Esto se debe a que el contexto de cuenta privilegiada de UAC elevado no tiene asignaciones de letras de unidad de red, y no es posible asignar letras de unidad para el contexto elevado a través del shell de Explorer o los scripts de inicio de sesión. Sin embargo, al crear un acceso directo al archivo por lotes utilizando la construcción PUSHD/ anterior POPD, y utilizando el acceso directo para ejecutar el archivo por lotes como administrador, la letra de la unidad temporal se creará y eliminará en el contexto de la cuenta elevada, y el archivo por lotes funcionará correctamente. .

La siguiente sintaxis se expande correctamente a la ruta del script por lotes actual.

%~dp0

Las rutas predeterminadas de UNC están desactivadas de forma predeterminada, ya que solían bloquear programas más antiguos.

El valor de registro de Dword DisableUNCChecken HKEY_CURRENT_USER\Software\Microsoft\Command Processorpermite que el directorio predeterminado sea UNC. CDEl comando se negará a cambiar, pero colocando una ruta UNC en el directorio predeterminado en un acceso directo a Cmd o usando el comando Inicio. ( compartir es para administradores). start "" /d \\127.0.0.1\C$ "cmd /k"C$

Conjunto de caracteres

Los archivos por lotes utilizan un juego de caracteres OEM, según lo definido por la computadora, p. Ej. , Página de códigos 437 . Las partes que no son ASCII de estos son incompatibles con los juegos de caracteres Unicode o Windows que de otro modo se usan en Windows, por lo que se debe tener cuidado. Los nombres de archivo que no están en inglés funcionan solo si se ingresan a través de un editor compatible con juegos de caracteres de DOS. Los nombres de archivo con caracteres fuera de este conjunto no funcionan en archivos por lotes.

Para obtener resultados en Unicode en conductos de archivos desde un comando interno como dir, uno puede usar el cmd /Ucomando. Por ejemplo, cmd /U /C dir > files.txtcrea un archivo que contiene una lista de directorios con los caracteres correctos de Windows, en la codificación UTF-16 LE.

Lote de virus y malware

Al igual que con cualquier otro lenguaje de programación, los archivos por lotes se pueden utilizar de forma malintencionada. Los troyanos simples y las bombas de bifurcación se crean fácilmente, y los archivos por lotes pueden provocar una forma de envenenamiento del DNS modificando el archivo de hosts . Los virus por lotes son posibles y también pueden propagarse a través de unidades flash USB utilizando la capacidad de ejecución automática de Windows .

El siguiente comando en un archivo por lotes eliminará todos los datos en el directorio actual (carpeta), sin pedir primero confirmación:

del /Q *.*

Estos tres comandos son una simple bomba de bifurcación que se replicará continuamente para agotar los recursos disponibles del sistema, ralentizando o bloqueando el sistema:

:TOP
 start "" %0
 goto TOP

Otros lenguajes de secuencias de comandos de Windows

El procesador de comandos cmd.exe que interpreta los archivos .cmd es compatible con todas las versiones de 32 y 64 bits de Windows hasta al menos Windows 10. COMMAND.EXE, que interpreta los archivos .BAT, fue compatible con todas las versiones de 16 y 32 bits. versiones de bits hasta al menos Windows 10.

Hay otros lenguajes de scripting, posteriores y más potentes, disponibles para Windows. Sin embargo, estos requieren que se instale el intérprete del lenguaje de secuencias de comandos antes de que se puedan usar:

  • KiXtart ( .kix ): desarrollado por un empleado de Microsoft en 1991, específicamente para satisfacer la necesidad de comandos útiles en una secuencia de comandos de inicio de sesión de red, al tiempo que conserva la "sensación" simple de un archivo .cmd.
  • Windows Script Host ( .vbs , .js y .wsf ): lanzado por Microsoft en 1998 y que consta de cscript.exe y wscript.exe, ejecuta scripts escritos en VBScript o JScript . Puede ejecutarlos en modo de ventana (con el host wscript.exe) o en modo basado en consola (con el host cscript.exe). Han sido parte de Windows desde Windows 98 .
  • PowerShell ( .ps1 ): lanzado en 2006 por Microsoft y puede funcionar con Windows XP (SP2 / SP3) y versiones posteriores. PowerShell puede operar tanto de forma interactiva (desde una interfaz de línea de comandos) como a través de scripts guardados, y tiene un gran parecido con los shells de Unix .
  • Se pueden usar lenguajes de scripting de shell de estilo Unix si está instalada una herramienta de compatibilidad con Unix, como Cygwin .
  • Las herramientas de secuencias de comandos multiplataforma, que incluyen Perl , Python , Ruby , Rexx , Node.js y PHP, están disponibles para Windows.

Los archivos de secuencia de comandos se ejecutan si se ingresa el nombre del archivo sin extensión. Hay reglas de precedencia que rigen la interpretación de, por ejemplo, DoThissi DoThis.com, DoThis.exe, DoThis.bat, DoThis.cmd, etc existen; por defecto DoThis.comtiene la máxima prioridad. Este orden predeterminado puede ser modificado en sistemas operativos más nuevos por la variable de entorno PATHEXT configurable por el usuario .

Ver también

Notas

Referencias

enlaces externos