[Batch] Buscar carpeta donde se encuentra un portable

Iniciado por ovichan, 19 Noviembre 2012, 04:06 AM

0 Miembros y 1 Visitante están viendo este tema.

ovichan

Buenas, por motivos un tanto raros he creado este script. Mi duda mas bien es para optimizar el codigo a algo que seguramente se pueda hacer mas sencillo que todo el codigo que he usado, y que ahora pongo.

Principalmente sirve para localizar la instalacion de un programa portable, en este caso VirtualDub.

Código (dos) [Seleccionar]

@echo off

:: Nos situamos en la siguiente carpeta

cd /d "%homedrive%\Program Files (x86)"

:Listamos directorios de la carpeta actual y comprobamos si se encuentra Virtualdub en ella

dir /b > "%temp%\info_vdub.txt"

::Buscamos coincidencia de string, creamos un archivo de texto para valernos del mensaje de errorlevel.

Find /i "virtualdub" < "%temp%\info_vdub.txt" > "%temp%\StringCheck.txt"

If %ERRORLEVEL% == 0 (
set "x86=true"
) else (
set "x86=false"
)
::Borramos archivos temporales

del "%temp%\StringCheck.txt"
del "%temp%\info_vdub.txt"

set "path_x86=%cd%"

:: Nos situamos en la siguiente carpeta y hacemos mas de lo mismo

cd /d "%homedrive%\Program Files"


dir /b > "%temp%\info_vdub.txt"

Find /i "virtualdub" < "%temp%\info_vdub.txt" > "%temp%\StringCheck.txt"

If %ERRORLEVEL% == 0 (

set "x64=true"
) else (
set "x64=false"
)

::Borramos archivos temporales

del "%temp%\StringCheck.txt"
del "%temp%\info_vdub.txt"

set "path_x64=%cd%"

::Info en pantalla

Echo VirtualDub esta instalado en:
echo.

if "%x86%"=="true" (

echo %path_x86%
echo.
)

if "%x64%"=="true" (

echo %path_x64%
echo.

)

Eleкtro

#1

Hombre, es un tema delicado teniendo en cuenta que el ejecutable/carpeta en realidad podría tener cualquier nombre modificado, en ese caso yo buscaría el nombre "virtualdub.exe" o "vdub.exe" (No recuerdo como era) en TODO el disco duro,
Pero por otro lado es muy retorcido que alguien le vaya a cambiar el nombre... así que voy a guiarme por tu script.

El script está bien, y veo progresos por tu parte porque no hay nada mal en el código, por otro lado es un código más sencillo de los que solias tener dudas xD.

CitarMi duda mas bien es para optimizar el codigo a algo que seguramente se pueda hacer mas sencillo que todo el codigo que he usado,
El script se puede optimizar insignificativamente saltando la parte "x86" si el equipo es de 64 bit, pero eso no lo voy a hacer.
Se puede simplificar todo en general, mucho, haciendo un mejor uso de la sintaxis, operadores y argumentos, se puede simplificar tanto que me ha salido una función xD:

Código (dos) [Seleccionar]
@echo off
REM By Elektro H@cker

:: Modo de empleo:
Call :APPSearch "Virtual Dub Mod"
REM Echo %Errorlevel% | MORE

Call :APPSearch "Programa inexistente"
REM Echo %Errorlevel% | MORE

Pause&Exit
:: : :: :: :: :: :: :: :: :: :: :: ::

:APPSearch
(
DIR /B /AD "%PROGRAMFILES%\%~1"      >NUL 2>&1 && SET "PF=%PROGRAMFILES%" || (
DIR /B /AD "%PROGRAMFILES(x86)%\%~1" >NUL 2>&1 && SET "PF=%PROGRAMFILES(x86)%")
) && (
Echo %~1 esta instalado en:
Call Echo "%%PF%%\%~1"
Exit /B 0
) || (
Echo %~1 no esta instalado.
Exit /B 1
)
GOTO:EOF




Saludos








ovichan

Juas, asi es mas sencillo, si señor. Si te fijas, casi lo que habia hecho era crear mi entorno en C donde me desenvuelvo mejor, porque esta sintaxis es delicada, pero sin duda gracias a ti aprendo mucho más.

Pense en buscar el ejecutable, de hecho hay scripts sencillitos, incluso vi alguno de Leo, pero era por cambiar y no buscar un archivo sino una carpeta.

Gracias Elektro ^^

ovichan

#3
[quote author=EleKtro H@cker link=topic=376384.msg1802310#msg1802310 date=1353328859]
:APPSearch
(
DIR /B /AD "%PROGRAMFILES%\%~1"      >NUL 2>&1 && SET "PF=%PROGRAMFILES%" || (
DIR /B /AD "%PROGRAMFILES(x86)%\%~1" >NUL 2>&1 && SET "PF=%PROGRAMFILES(x86)%")
) && (
Echo %~1 esta instalado en:
Call Echo "%%PF%%\%~1"
Exit /B 0
) || (
Echo %~1 no esta instalado.
Exit /B 1
)
GOTO:EOF




Una pregunta del codigo que no quise preguntarte pero me esta corroyendo jeje. El >nul lo utilizas para que redireccione el resultado del dir a nul, o sea para que no muestre nada en pantalla. Y el 2>&1, es para redirigir el posible error a 1, de manera que no muestre nada en pantalla. Hasta ahi creo que estoy en lo cierto, pero el uso de &, delante del 1, es porque has pasado un parametro a la etiqueta al usar call, no?? En un codigo sin usar call, seria simplemente 2>1, no? Lo del exit, es como return 0 (sin errores).

Al final te metere en nomina, aunque tocariamos a poco ¬¬'

Eleкtro

#4
si usas "2>1" se creará el archivo "1", para hacer referencia a una salida tienes que usar el operador "&" como en el ejemplo.

EDITO: Osea, con "1>NUL 2>&1" rediriges la misma salida (1 y 2) a "NUL".
el "1>NUL" no lo ves en mi code porque la salida por defecto es "1" así que con poner ">NUL" es suficiente.

http://ss64.com/nt/syntax-redirection.html

(Tema bloqueado hasta finalizar el tuto) Tutorial extendido de aprendizaje Batch
4.6 Operadores de desplazamiento lógico (o Redireccionamiento)


y...
Exit /B (el código de salida que quieras)

Cita de: ovichan en 20 Noviembre 2012, 02:59 AMAl final te metere en nomina, aunque tocariamos a poco ¬¬'
Con poco ya me conformo pa salir de esta crisis :xD

saludos