Necesito ayuda

Iniciado por Magnumrace, 27 Abril 2021, 21:44 PM

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

Magnumrace

Buenas necesito ayuda para crear un archivo bat que haga lo siguiente:

-Comprueba que la unidad USB está conectada al sistema y procede a la copia. Si no existe la unidad USB no se realiza la copia. Para ello se puede usar wmic.

Lo que tengo yo ahora es esto:

@echo off
xcopy C:\Users\Usuario\Documents\Fundamentos E:\
echo Copia Completada
@Pause


Cual es el problema? Que no sé nada sobre esto, apenas me estoy informando, mi profesor de hardware está explicando un poco de programación cosa que no debería y me está dando bronca :-\. Debe ser una idiotez lo que pido, pero no sé como hacerlo.

Cualquier ayuda seria genial.

WHK

Hola, si tu profesor te está evaluando para lo que no te enseñó entonces deberías denunciarlo al rector.

De todas maneras debes usar la sentencia "exist" y la unidad, a eso debes anteponer una condicional de tipo if y dentro del bloque realizar la acción de copiado, en caso contrario debería lanzar un echo con el mensaje de error y retornar un valor positivo para indicarle al sistema que se produjo un error en el resultado del script.

Espero te sirva, saludos.

EdePC

wmic sirve para ver información del sistema, ahora bien, como siempre estas tareas dependen mucho del contexto, es decir, que instrucciones usar (wmic), cuan complejo puede ser el script, etc, pero también puede faltar la manera de identificar a ese USB que se menciona, puede ser por su nombre, marca, modelo, letra de unidad, Hardware ID, etc.

Parece algo genérico, así que debería de bastar con DeviceID para sacar la Letra de Unidad y DriveType para sacar si es una unidad extraíble o no. El problema es que dices que no sabes nada del tema :xD

Lo más simple y sencillo sería:

Código (bash) [Seleccionar]
WMIC LogicalDisk Where DriveType=2 >nul && xcopy C:\Users\Usuario\Documents\Fundamentos E:\

- Esto sí usar WMIC es obligatorio para identificar que la Unidad es Extraíble y agregando tu suposición de que la Unidad será siempre E:\, sino habría que agregar más líneas para identificar también la Letra de Unidad, incluso si hay más de una Unidad Extraíble u otra manera de identificarlas

Magnumrace

Cita de: WHK en 27 Abril 2021, 22:19 PM
Hola, si tu profesor te está evaluando para lo que no te enseñó entonces deberías denunciarlo al rector.

De todas maneras debes usar la sentencia "exist" y la unidad, a eso debes anteponer una condicional de tipo if y dentro del bloque realizar la acción de copiado, en caso contrario debería lanzar un echo con el mensaje de error y retornar un valor positivo para indicarle al sistema que se produjo un error en el resultado del script.

Espero te sirva, saludos.

Gracias por tu ayuda! He intentado aprender un poco de los comandos nuevos que desconozco y me has dicho, pero aún sigo intentando y no me ha salido aún  :xD

Magnumrace

Cita de: EdePC en 27 Abril 2021, 23:09 PM
wmic sirve para ver información del sistema, ahora bien, como siempre estas tareas dependen mucho del contexto, es decir, que instrucciones usar (wmic), cuan complejo puede ser el script, etc, pero también puede faltar la manera de identificar a ese USB que se menciona, puede ser por su nombre, marca, modelo, letra de unidad, Hardware ID, etc.

Parece algo genérico, así que debería de bastar con DeviceID para sacar la Letra de Unidad y DriveType para sacar si es una unidad extraíble o no. El problema es que dices que no sabes nada del tema :xD

Lo más simple y sencillo sería:

Código (bash) [Seleccionar]
WMIC LogicalDisk Where DriveType=2 >nul && xcopy C:\Users\Usuario\Documents\Fundamentos E:\

- Esto sí usar WMIC es obligatorio para identificar que la Unidad es Extraíble y agregando tu suposición de que la Unidad será siempre E:\, sino habría que agregar más líneas para identificar también la Letra de Unidad, incluso si hay más de una Unidad Extraíble u otra manera de identificarlas

Gracias! Me has ayudado bastante. Solo tengo una pregunta. Supongamos que está en otra unidad el USB.
¿Cómo hago para interactuar con el script y le diga que está en el :H? Y si no está conectado le puedo agregar un mensaje diciendo que no está esa unidad conectada?

Todo me viene de mucha ayuda, puesto que, es todo nuevo para mi. Estoy estudiando administración en sistemas informáticos en red y esto que me está enseñando mi profesor de hardware se va de tema por así decirlo.

EdePC

Bueno, como ya dije se puede usar el DeviceID para obtener la letra de Unidad de la Unidad de Almacenamiento USB, para esto ya hay que complicar un poquito el Script:

Código (dos) [Seleccionar]
@Echo Off
For /F %%a In (
  'WMIC LogicalDisk Where DriveType^=2 Get DeviceID 2^>NUL ^| Find ":"'
) Do (
  Echo Unidad %%a encontrada
  xcopy C:\Users\Usuario\Documents\Fundamentos %%a
  GoTo :salir
)
Echo No hay Unidad USB

:salir
Pause
Exit /B


El único detalle ahora es cuando hay más de una USB :xD, este Script solo hace la copia en la Primera que encuentra.

Tienes un tutorial de Batch básico/medio acá:
Tutorial de Programación Batch (Nikos3194, 2013)
https://sites.google.com/site/nikos3194rfcindex/Tutorial%20de%20programacion%20Batch%20%5Bfinal%5D.pdf

Recuerda que siempre puede hacer un /? para obtener ayuda de un comando, por ejemplo:

Código (dos) [Seleccionar]
WMIC /?

Salvo el comando WMIC todo lo demás está bien explicado en el Tutorial que puse antes.

Magnumrace

Cita de: EdePC en 28 Abril 2021, 21:38 PM
Bueno, como ya dije se puede usar el DeviceID para obtener la letra de Unidad de la Unidad de Almacenamiento USB, para esto ya hay que complicar un poquito el Script:

Código (dos) [Seleccionar]
@Echo Off
For /F %%a In (
  'WMIC LogicalDisk Where DriveType^=2 Get DeviceID 2^>NUL ^| Find ":"'
) Do (
  Echo Unidad %%a encontrada
  xcopy C:\Users\Usuario\Documents\Fundamentos %%a
  GoTo :salir
)
Echo No hay Unidad USB

:salir
Pause
Exit /B


El único detalle ahora es cuando hay más de una USB :xD, este Script solo hace la copia en la Primera que encuentra.

Tienes un tutorial de Batch básico/medio acá:
Tutorial de Programación Batch (Nikos3194, 2013)
https://sites.google.com/site/nikos3194rfcindex/Tutorial%20de%20programacion%20Batch%20%5Bfinal%5D.pdf

Recuerda que siempre puede hacer un /? para obtener ayuda de un comando, por ejemplo:

Código (dos) [Seleccionar]
WMIC /?

Salvo el comando WMIC todo lo demás está bien explicado en el Tutorial que puse antes.

Me has ayudado bastante! Gracias! Seguro este fin de semana empiece a ver un poco y entender mejor el tema.

Saludos!

Serapis

No creo que tu profesor pretenda de verdad que resuelvas el tema, sin antes leer la documentación.

El siguiente comando te ilustra sobre las opciones del comando referido:
>wmic logicaldisk /?
En la ruta ...windows\help\ probablemente encuentres el fichero de ayuda: wmic.chm, de no ser así haz una búsqueda por los archivos en tu sistema luego ordénalos por tipo y mira a ver cual es de ayuda: "*wmi*.*"

Código (BNF) [Seleccionar]

Formal WMIC command syntaxThe WMIC command-line BNF:

<WMI Command>  ::=  [<global switch list>] <command> 
<global switch list>  ::=  <global switches> | <global switches> <global switches list> 
<global switches>  ::=  (/NAMESPACE | /ROLE ) [:<namespace>] |
        /NODE [:<computer id list>] |
        /IMPLEVEL [:<ilevel>] |
        /AUTHLEVEL [:<alevel>] |
        /LOCALE [:<locale identifier>] |
        /PRIVILEGES [:<property>] |
        /TRACE [:<option>] |
        /RECORD [:<file path>] |
        /INTERACTIVE
        /USER [:<user id>] |
        /PASSWORD [:<password id>] |
        /? [:<help type>] 
<computer id list>  ::=  <computer id> | <computer id> <computer id list> 
<command >  ::=  (<alias> [ <WMI object>] | [<alias>] <path where>) [<verb clause>] |
        EXIT |
        CLASS [<class path expression >] [<verb clause>] |
        RESTORE [ <restore file path>] 
<path where>  ::=  [PATH (<path expression> | <class path expression> )][ WHERE <where clause>] 
<alias>  ::=  !! name for the alias. The name will be unique in the context of the namespace in which the alias is defined.
        Note CLASS, PATH, WHERE, RESTORE and EXIT cannot be used as alias names as they appear in the same location in the syntax. 
<WMI object>  ::=  <parens> <alias parameters> <parens> | <alias parameters> 
<path expression>  ::=  !! A WMI path expression including a key clause 
<where clause>  ::=  !! A WQL where clause optionally surrounded by parenthesis 
<class path expression >   !! A WMI path expression that does not include a key clause 
<alias parameters>  ::=  !! one or more space delimited literals that will be used as substitutions in the alias' PWhere value. 
<verb clause>  ::=  (<verb> [<verb parameters>] |
<standard verb>) [<verb switches>] 
<verb>  ::=  <property name> | <identifier> |
<method name> 
<verb switches>  ::= 
        /INTERACTIVE |
        /NOINTERACTIVE 
<verb parameter>  ::=  <actual parameter> | <actual parameter> , <verb parameter> 
<standard verb>  ::= 
        <get verb> |
        <list verb> |
        <assoc verb> |
        <call verb> |
        <create-set verb> |
        <delete verb> 
<identifier>  ::=  <idhead> [<idrest>] 
<idhead>  ::=  <letter> 
<idrest>  ::=  <identifier> [<letter> | <digit>] 
<get verb>  ::=  GET [<property list>] [<get switches>] 
<property list>  ::=  <property name> | <property name> , <property list> 
<list verb>  ::=  LIST [<list format>|<list switches>] 
<assoc verb>  ::=  ASSOC [<format specifier>] 
<call verb>  ::=  CALL <method name> [<actual parameter list>] 
<actual parameter list>  ::=  <actual parameter> | <actual parameter , <actual parameter list> 
<create-set verb>  ::=  SET <assign list>| CREATE <assign list> 
<assign list>  ::=  <property name> = <property value> |
<property name> = <property value> <assign list> 
<delete verb>  ::=  DELETE 
<get switches>  ::= 
        /VALUE |
        /ALL |
        /TRANSLATE :<table name> |
        /EVERY :<interval> |
        /FORMAT [:<format specifier>] |
        /DESCRIPTION [:<code page>] 
<interval>  ::=  !! numeric value indicating frequency within which values should be returned 
<format specifier>  ::= 
        :<xsl file name> |
        :TABLE |
        :MOF 
<list format>  ::= 
        BRIEF |
        INSTANCE |
        SYSTEM |
        STATUS |
        FULL |
<user format> 
<list switches>   
        /TRANSLATE |
        /EVERY :<interval>|
        /FORMAT [:<format specifier>] 
<help type>  ::= 
        : BRIEF |
        : FULL