Su script original hace lo siguiente, línea por línea:
@echo on
Le dice al símbolo del sistema que imprima cada comando en el archivo por lotes antes de ejecutarlos. Esto es solo para que pueda "ver" lo que realmente está haciendo antes de que lo haga.
cd "C:\Users\MVD21\Desktop\test"
C Hanges D irectorio en lo que espero es la ruta en la que desea comprimir todos los archivos.
FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"
El parámetro para el IN
aquí es (C:\Users\MVD21\Desktop\test)
. Esto hará que el "cuerpo" del bucle (la acción detrás de la palabra clave DO
) se ejecute exactamente una vez , con el %i
parámetro asignado al valor C:\Users\MVD21\Desktop\test
. ¡No es sorprendente que esto no haga lo que quieres! Parece que esto comprimiría todo el directorio en un solo archivo .7z.
Si no hace nada , probablemente sea porque no puede encontrar el camino de 7z.exe
. Si ese archivo no está en el directorio actual (ese test
directorio mencionado anteriormente), entonces tendrá que estar en PATH
(en la %PATH%
variable de entorno; intente echo %PATH%
en un shell para ver en qué está configurado actualmente). De lo contrario, debe copiar 7z.exe
en el directorio actual o especificar una ruta absoluta a donde se encuentra (como, por ejemplo, "C:\Program Files\7-zip\7z.exe" ...
).
pause
Cuando finaliza el script, esta palabra clave solo le dice al shell que espere a que presione enter o cierre el símbolo del sistema en lugar de salir de él inmediatamente.
Cuando está creando un script por lotes (o, de hecho, cualquier otra cosa que se ocupe del código), debe dejar de tratar todo el script como una copia-pegar monolítica que no (intenta) entender, y en su lugar desglosa problema en sub-partes que puede resolver individualmente, luego engancharlas Esto le permitirá resolver problemas de forma independiente y crear soluciones en lugar de pedirle a otra persona que haga todo su trabajo por usted. Lo recomiendo altamente.
En su caso, tiene los siguientes subcomponentes de su problema:
- Iterar (recorrer) cada archivo contenido en un directorio dado.
- Para cada archivo dado, colóquelo en un archivo .7z invocando la
7z
utilidad.
Las posibilidades de que alguien tenga una respuesta que resuelva sus necesidades específicas es menor que la posibilidad de encontrar las piezas más generales individualmente.
Esta pregunta, 'Cómo hacer algo a cada archivo en un directorio en un script por lotes' resuelve la mitad de su problema.
El objetivo de la respuesta es que solo comienza con esta parte de esa respuesta de StackOverflow:
for /f "usebackq delims=|" %%f in ('dir /b "c:\program files"') do echo %%f
y cambia la parte en la que está haciendo algo (el echo %%f
) para hacer lo que quieres hacer . Sé que debe cambiar esa parte, porque analicé el texto del script y entendí lo que significa cada carácter y parámetro, por lo que puedo razonar sobre dónde quiero insertar mi propio código.
Aquí hay un "código aéreo" (¡no probado!):
for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~ni.7z" "%i"
Las declaraciones @echo on
y pause
anteriores son una buena práctica, por lo que puede dejarlas. Y probablemente también quiera guardar esa cd
declaración, si sus archivos se encuentran en esa ruta.
Entonces, ¿qué nos deja eso?
@echo on
cd "C:\Users\MVD21\Desktop\test"
for /f "usebackq delims=|" %%f in ('dir /b "C:\Users\MVD21\Desktop\test"') do 7z.exe a "%~nf.7z" "%f"
pause
Si respondes con "¡No funciona!", NO te ayudaré. Si intenta esto y no funciona, DEBE decirme en los comentarios la siguiente información:
- ¿Qué mensaje de error exacto aparece en el símbolo del sistema cuando ejecuta estos comandos o los coloca en un archivo por lotes y los ejecuta? No abreviar; copie y pegue el resultado directamente (póngalo en http://pastebin.com si es mucho).
- ¿Qué crees que el mensaje de error te dice que es el problema?
- ¿Dónde se encuentra su instalación de 7-zip (la ruta del archivo)?
- ¿La ubicación del archivo de su instalación de 7-zip está incluida en el contenido de la
PATH
variable de entorno? (marque esto, como se mencionó anteriormente, con echo %PATH%
un cmd
aviso).