Procesamiento por lotes de procesamiento por lotes
Aprenda algunos conocimientos triviales pero valiosos sobre el procesamiento por lotes. Después de aplicar este conocimiento, podrá realizar mejor la función del procesamiento por lotes y hacer que el mundo se vuelva más colorido. La llamada "variable de entorno" en realidad significa "variable" en lenguaje C. Las variables de procesamiento por lotes se pueden dividir en dos categorías, variables del sistema definidas por el sistema y variables de usuario personalizadas por el usuario según las necesidades.
1. Variables del sistema
Algunas variables para el procesamiento por lotes están predefinidas por el sistema operativo y se pueden aplicar a cualquier procesamiento por lotes. A estas variables especiales las llamamos "variables del sistema". Hay muchas variables del sistema, incluidas clases de hardware, clases de sistema operativo, clases de ruta de archivo, clases de hora del sistema, etc. Para ver todas las variables del sistema, abra una nueva ventana de cmd, ingrese set y presione Enter. Varias variables de uso común se explican a continuación:
Nombre de la computadora, es decir, haga clic con el botón derecho en Mi PC - Propiedades - "Nombre completo de la computadora" en la pestaña Nombre de la computadora ComSpeccmd.exe. HomeDrive La letra de la unidad de partición del sistema suele ser la unidad C, por lo que HomeDrive=C:
Ruta es la ruta de búsqueda predeterminada para archivos ejecutables. ¡Esto es muy importante! Lo explicaré por separado más adelante...
ProgramFiles es la ruta de los archivos de programa del sistema, generalmente C:\Program Files. Esta es la ruta de instalación predeterminada al instalar el software.
Pregunta. ¡Un arma imprescindible para personalizar las indicaciones de cmd! Sin embargo, no lo he usado mucho~
SystemDrive es la partición que contiene el directorio raíz del sistema, que en realidad es HomeDrive
SystemRoot es la ruta del directorio raíz del sistema, generalmente C:\ WINDOWS
Los archivos Temp, Tmp, programas, etc. pueden usar el directorio temporal, el valor predeterminado es C:\WINDOWS\Temp o Tmp. Casi todos los programas escribirán archivos "temporalmente" en este directorio cuando se ejecuten. En circunstancias normales, el programa debe eliminar los archivos temporales escritos por el programa. Desafortunadamente, la mayoría de los programas son muy olvidadizos, lo que hace que esta carpeta ocupe cada vez más espacio, lo que naturalmente engorda nuestro sistema. Por lo tanto, necesitamos modificarlo a otras particiones y limpiar los archivos temporales que contiene de vez en cuando.
Nombre de usuario es el nombre de usuario actual, que es el nombre de la cuenta que inició sesión.
Perfil de usuario es el directorio de configuración del usuario actual, generalmente C:\Documentos y configuraciones\%Nombre de usuario %. De forma predeterminada, nuestro escritorio es la carpeta "Escritorio" en este directorio; mis documentos son la carpeta "Mis documentos" en este directorio. Entonces, cuando coloca cosas en el escritorio o en Mis documentos, las coloca en esta carpeta, es decir, en la unidad C. Al reinstalar el sistema, el contenido de la unidad C debe sobrescribirse, por lo que el contenido del escritorio. o en Mis documentos Por supuesto que las cosas se llevaron el viento ~ Hay dos soluciones: una es mantener buenos hábitos y no colocar archivos importantes en estos dos lugares; la otra es modificar la configuración predeterminada y mover ambas carpetas a otras particiones; .
La ruta del sistema operativo WinDir es en realidad SystemRoot. Al escribir un programa por lotes, las variables definidas por el usuario según sus propias necesidades se denominan variables de usuario. Las variables de usuario son similares a las variables en lenguaje C y solo son válidas en el programa en el que se define la variable.
Las variables de usuario se definen mediante el comando set, que es una operación muy importante en el procesamiento por lotes, lo que convierte al comando set en uno de los comandos más utilizados en el procesamiento por lotes. Para utilizar el comando set, consulte set /?, que también se explicará más adelante en este tutorial.
3. Referencia de variables
En las lecciones anteriores, hemos visto cómo hacer referencia a variables, es decir, operar directamente la variable con el nombre de la variable y obtener el valor de la variable a través de% o!.
Entre ellos, ¡solo necesita usar! cuando asigna repetidamente la misma variable varias veces en una declaración for, y cuando usa! Habilitar expansión retrasada. Además, debe tenerse en cuenta que después de "habilitar la expansión retardada de variables de entorno", todos los ! se considerarán símbolos especiales para "obtener valores de variables", y el símbolo no se puede generar incluso si se usa ^! ¡Para generar!, necesita "deshabilitar la expansión retardada de variables de entorno", el comando es: SetLocal DisableDelayedExpansion Similar al lenguaje C, es posible que deba pasar parámetros al llamar a funciones u otro procesamiento por lotes. La transferencia de parámetros para el procesamiento por lotes se divide en dos métodos: directo e indirecto.
1. Transferencia directa
Transfiera parámetros directamente, es decir, cuando se usa el comando de llamada, no se utilizan parámetros y las variables en la función principal (también llamada lote principal) se modifican directamente en la subfunción o sublote. Esto es similar al método de paso de parámetros en lenguaje ensamblador.
Ejemplo de paso de parámetros directamente:
=============================== ==== ================
@echo off
setlocal enableelayedexpansion
set var=aCdehiM ,?mnrstW y
echo %var%
call :deal
setlocaldisablededelayeexpansion
set var=%var:?=! %
echo %var%
pausa>nul
salir
:oferta
set tm=! var! p>
establezca var=
para %%i en (6,3,11,11,16,15,1,4,11,5,12,13,9 ,0,12 ,7,15,14,5,10,2,16,18,8) hacer (
set var=!var!!tm:~%%i,1! p>
)
ir a :eof
============================ ======= ================
Se puede encontrar que cuando asignamos la variable var como parámetro a la subfunción: después del trato, la subfunción modifica el valor de var; cuando la subfunción regresa, el valor de var en la función principal ya es el valor modificado de var en la subfunción.
En este ejemplo, se utilizan setlocal enableelayeexpansion y setlocal enableelayeexpansion mencionados anteriormente en esta lección. El primero garantiza que var se pueda procesar según nuestros deseos en el bucle for, y el segundo garantiza que se puedan generar símbolos. correctamente!. Además, el comando set también se usa en el ejemplo para procesar la cadena usando set. Hay otro lugar donde se usa la declaración goto: eof. Esta declaración es equivalente a regresar en lenguaje C o RET en lenguaje ensamblador, es decir, el comando de retorno de subrutina. Cabe señalar que cuando la subfunción en sí está al final del archivo por lotes, podemos omitir esta oración. Por ejemplo, eliminar goto :eof en este ejemplo no tendrá ningún impacto.
2. Transferencia indirecta
Transferencia indirecta de parámetros, es decir, cuando se usa el comando de llamada, agregue parámetros después, en forma de llamada {[:label][ChildBatch]} Parámetro1 Parámetro2 ... ParámetroN. Esto es similar al formato de paso de parámetros en lenguaje C. A diferencia del lenguaje C, las subfunciones en el procesamiento por lotes no necesitan definir parámetros formales, y mucho menos especificar el número de parámetros.
Los parámetros pasados se expresan en forma de% 1 ~% 9 en la subfunción o sublote, es decir,% 1 ~% 9 representan respectivamente los parámetros del 1 al 9.
============================================ = ====
@echo apagado
llamada: trato aaa bbb c c ddd eee
pausa>nul
salir p >
:trato
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2< / p>
eco %%3 = %3
eco %%4 = %4
eco %%5 = %5
== = =============================================
A través de este ejemplo, puede ver claramente el uso de la notación de parámetros %n. Las listas de parámetros que contienen espacios aún deben estar entre comillas dobles (); además, también puede ver que %0 se ha convertido en la etiqueta de la función secundaria, no en el nombre completo del archivo del lote principal.
3. Diferencia
Esencialmente no hay diferencia entre los dos métodos de paso de parámetros. Formalmente, la transferencia directa opera directamente en la variable original y pierde el valor de la variable original. La transferencia indirecta opera en la variable original a través de% n. Proporciona una copia de seguridad sencilla y es más versátil, es decir, el nombre de la variable original no está limitado. Además, otro gran beneficio de usar %n es que puedes usar %~*i para mejorar la capacidad de manejar variables. Con respecto a %~*i, consulte /? para obtener más detalles.
En función de las diferencias entre los dos, puedes decidir qué método de entrega utilizar según la situación:
--1. Cuando el nombre de la variable utilizada como parámetro es fijo y no es necesario realizar una copia de seguridad en la subfunción, utilice el método de transferencia directa;
--2. Si la subfunción se utiliza como un módulo de programa general para adaptarse al procesamiento de diferentes variables, o cuando no es necesario realizar una copia de seguridad de las variables utilizadas como parámetros, utilice el método de transferencia indirecta.
El método a utilizar depende de la situación real o de los hábitos de uso. Algunos comandos devolverán un determinado valor de error (nivel de error) después de la ejecución. El estado de ejecución del comando se puede juzgar por el valor de nivel de error. Esto es similar a exit(num) en lenguaje C, donde num es el código de error.
La forma de obtener el valor de retorno nivel de error es llamar al valor de retorno nivel de error inmediatamente después de ejecutar el comando, como echo %errorlevel% o if %errorlevel%==1 y otros comandos.
Ejemplo de nivel de error:
================================== === ==============
@echo off
reg agregar HKCU /v try /f>nul
reg eliminar HKCU /v intentar /f
si el nivel de error es 0 (¡eliminación del eco exitosa!) en caso contrario (¡la eliminación del eco falló!)
reg eliminar HKCU /v intentar /f
if %errorlevel%==0 (¡eliminación del eco exitosa!) else (¡eliminación del eco fallida!)
pausa>nul
========= === ===================================
En el ejemplo anterior, debido al primer éxito, el registro se eliminó, lo que provocó el segundo error porque no se pudo encontrar el registro. Al mismo tiempo, también vimos el uso de errorlevel, es decir, si errorlevel 0 y %errorlevel%==0 son iguales.
Tal vez hayas notado que hay una cara sonriente en él ~ O (∩_∩) O jaja ~ Este es el código ASCII, te lo contaré más tarde...
En circunstancias normales, Cuando un programa o comando se ejecuta correctamente, el nivel de error devuelto es 0 y se devuelve un valor de 1 o superior en caso de error. Por supuesto, algunos comandos no tienen valor de retorno, por lo que debes prestar atención a esto.
Mmmm, ¿recordabas que antes había algo parecido? Por cierto, eso es || y &&;. Estos dos símbolos se juzgan lógicamente en función del valor del nivel de error. En el ejemplo anterior ya hemos utilizado una vez el código ASCII, es decir, la carita sonriente. Los códigos ASCII son símbolos gráficos que se pueden utilizar para embellecer nuestro procesamiento por lotes.
En la ventana cmd, podemos ingresar el carácter mediante el código ASCII de cualquier carácter, como Ctrl+G, Ctrl+N, etc. Las letras a-z corresponden a los códigos ASCII 97-122. Para caracteres con códigos ASCII mayores a 26, puede ingresarlos mediante este método: mantenga presionada la tecla Alt, ingrese el valor decimal del código ASCII a través del teclado pequeño y suelte la tecla Alt.