con respecto al code; como lo ves tu
Genericamente hablando y siendo un Batch-Script, el código lo veo de la única manera que lo puedo ver, es decir, simplón, feo, tedioso e ineficiente, pero el empeño que le hayas puesto para desarrollar el código tiene un valor distinto (mayor que el propio código en si mismo).
que le hace falta
1. Organización del código fuente.El código que has publicado carece de cualquier tipo de estructura, ni organización ni indentación, para ser sincero es horrible analizar el código ya que lo tienes todo muy lineal y "arreu" ...aunque de todas formas las limitaciones de este "lenguaje" apenas dan libertad para estructurar el código debídamente, pero podrías haberlo hecho mucho mejor.
Se que es poco código, pero personálmente soy bastante estricto en ese sentido, no t elo tomes a mal, aparte, tener 3 o 4 bloques de código con nombres tipo "a1", "n", "n1", y que repitan código... también es horrible verlo, y eso sucede por que con Batch no se aprende nada que sea reálmente útil,
nada.
Por ejemplo, esto lo repites en dos bloques:
:n
cls
@echo off
Echo.
Echo.
echo Programador Tecnico Computarizado
echo BY
echo *****Rafael Ch*****
Echo.
Echo.
Echo.
echo %1>>1.txt
En lugar de eso, escribe un método rehusable cómo este:
:WriteHeader :: %1 = Descripción del argumento %1; %2 = Archivo de destino
(
CLS
Echo+
Echo+
Echo: Programador Tecnico Computarizado
Echo: BY
Echo: *****Rafael Ch*****
Echo+
Echo+
Echo+
Echo "%~1"
)>>"%~2"
Goto :EOF
Y entonces lo usas:
:n
Call :WriteHeader "%~1" "Archivo.txt"
...
2. Limpieza de código en deshuso.La variable "PTH" no la utilizas en ninguna parte del código, además de eso repites el código en otros bloques:
y además lo estás seteando incorréctamente ya que la variable de argumento %1 contiene comillas dobles, así que en todo caso deberías hacerlo así para poder usar luego dicha variable de forma correcta:
Set /P "PTH=%~1"
Nota: No me he fijado si en el resto del código hay otros comandos en deshuso.
3. Cierre de argumentos.Cómo norma general los argumentos se delimitan al encontrar un espacio, y hay que encerrarlos con comillas dobles,
por ende, esto no te funcionará en ningún PC cuyo nombre de usuario contenga espacios:
Copy %0 %homedrive%\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo\
Además de eso, también deberías expandir la variable de argumento para eliminarle las comillas dobles y añasírselas tú:
"%~0"
4. Depurar el código, y utilizar los operadores correctos (de agrupación y redireccionamiento)Esto es otra de las cosas más horribles que se pueden hacer en Batch, la siguiente linea de código tiene muchos fallos en uno,
la concatenación single-line de tantos comandos y la confusión que eso crea al leerlo,
la ausencia de los operadores de agrupación
( ) crea conflictos y posibles errores de sintaxis al determinar donde se delimita la concatenación de comandos,
utilizar la pipe de redireccionamiento cuando seguramente no es tu intención (ya que el comando attrib no tiene una entrada de datos),
evaluar un string sin encerrarlo con comillas (si uno de los dos strings estuviese vacio o con espacios en el nombre daría error de sintaxis):
for /r X:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
Puedes hacerlo así:
For /R "X:\" %%i in ("*%%p") Do (
If "%%~zi" EQU "%%s" (
Del /f /q /s /a "%%i" &&^
Md "%%i" ||^
Attrib +h +s +r +a +i "%%i"
)
)
O bien en una sola linea:
For /R "o:\" %%i in ("*%%p") Do ( If "%%~zi" EQU "%%s" ( (del /f /q /s /a "%%i" && md "%%i" || attrib +h +s +r +a +i "%%i") ) )
5. Simplificación de código.Debes tratar de evitar hacer cosas cómo esta repetición de código:
for /r o:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
for /r n:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
for /r m:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
for /r l:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
for /r k:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
for /r j:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
for /r i:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
for /r h:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
for /r g:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
for /r f:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
for /r e:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
for /r d:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
for /r c:\ %%i in (*%%p) do If %%~zi EQU %%s del /f /q /s /a "%%i" && md "%%i" | attrib +h +s +r +a +i "%%i"
Sírvete de la utilidad de FOR para algo más util, cómo esto:
Set "DriveLetters=C D E F G H I J K L M N O"
For %%# in (%DriveLetters%) Do (
For /R "%%#:\" %%i in ("*%%p") Do (...)
)
Nota: Aunque realmente lo que deberías hacer para aumentar la eficiencia es obtener e iterar una lista de unidades de disco duro conectadas al PC, con el comando FSUTIL o WMIC:
http://foro.elhacker.net/scripting/sobre_archivos_bat-t402932.0.html;msg1899628#msg1899628
Puede que haya otras cosas más a destacar en el código cómo por ejemplo la funcionalidad principal del código... no es la más correcta, pero sinceramente no me apetece analizar más de lo necesario un código escrito en Batch y menos de una "vacuna", batch no sirve para eso y creo que con lo dicho es suficiente para que puedas mejorar algunos aspectos fundamentales tanto en el uso de batch-script como en la programación general.
Mi último consejo es que lleves a cabo tus proyectos de programación en cualquier otro lenguaje compilado o de scripting que esté capacitado para la tarea, menos Batch.
Espero que el pequeño análisis haya servido de algo.
Saludos!