Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Dan567897 en 24 Abril 2018, 01:27 am



Título: Duda sobre este intento de batch
Publicado por: Dan567897 en 24 Abril 2018, 01:27 am
Hola buenas, es mi primer post así que sed amables.
Os comento, quiero hacer un batch el cual detecte qué sistema operativo tienes instalado (es una chorrada pero me vendrá bien en el futuro)


Código:

@echo off
color A
:Inicio
echo Vamos a comprobar su sistema operativo
TIMEOUT 3
goto :sistema

:Sistema
cls
set sistema=ver %sysver%
if "sistema"=="Microsoft Windows [Versión 6.1*" goto W7
if "sistema"=="Microsoft Windows [Versión 6.2*" goto W8
if "sistema"=="Microsoft Windows [Versión 6.3*" goto W8
if "sistema"=="Microsoft Windows [Versión 6.4*" goto W10
if "sistema"=="Microsoft Windows [Versión 10.*" goto W10

:W7
color B
echo.
echo.
echo Usted tiene el Sistema Operativo Windows 7
goto :end
:W8
color B
echo.
echo.
echo Usted tiene el Sistema Operativo Windows 8
goto :end
:W10
color B
echo.
echo.
echo Usted tiene el Sistema Operativo Windows 10
goto :end



:end
pause>nul
exit

Quiero saber cuales son mis errores ya que nunca he programado batch y quiero aprender.
Gracias de antemano y un saludo.  :rolleyes:


Título: Re: Duda sobre este intento de batch
Publicado por: Eleкtro en 24 Abril 2018, 06:05 am
Quiero saber cuales son mis errores ya que nunca he programado batch y quiero aprender.

No es por ser rudo o antipático, pero el primer error de todos es la propia intención de querer aprender Batch. No te va a servir para nada, y si como tu has dicho no sabes nada de Batch entonces estás a tiempo de no emprender una mala decisión que no te aportará NADA. Mi consejo es que aprendas cualquier otro lenguaje. Para empezar tienes otros lenguajes nativamente soportados en Windows, como son Visual Basic Script, javascript (javascript for Windows), o PowerShell. Si realmente quieres hacer cosas sofisticadas entonces deberías ir directo a Powershell, ya que puedes utilizar todas las clases de .NET Framework, y gracias a eso además puedes programar en C# y VB.NET en Powershell, si lo pefirieses.

Respecto a los errores del código, el más relevante y por el cual ese código nunca te va a funcionar de la manera en que esperas:

set sistema=ver %sysver%

...no puedes asignar/redireccionar la salida de un comando directamente a una variable, Batch es un lenguaje muy limitado. Aparte de eso, no llego a comprender la intención que pudiste tener al escribir esa variable "%sysver%", ya que el comando ver no acepta ningún argumento, y de todas formas no declaraste ninguna variable con el nombre "sysver".

Para lograr lo que intentas hacer debes utilizar un búcle de tipo For /F para deliminar/tokenizar y así parsear la salida del comando ver.

  • https://ss64.com/nt/for_cmd.html

Para serte sincero, eso que piensas hacer en Batch no merece la pena, el código te va a quedar muy engorroso. Aparte, el comando ver muestra la salida en el idioma acual... eso es una incomodidad u obstáculo adicional.

if "sistema"==...

Ahí cometes otro error grave, y es que estás comparando la cadena de texto "sistema", no el valor de la variable %sistema%... puesto que te falta añadirle el símbolo % al principio y al final de la cadena de texto para tratarla como variable.



En Powershell, para obtener la versión del sistema operativo sería de la siguiente manera:

Código
  1. [System.Version]$version = $null
  2.  
  3. try {
  4.    # As of Powershell v3.
  5.    # WMI: Win32_OperatingSystem Class
  6.    # https://msdn.microsoft.com/en-us/library/aa394239%28v=vs.85%29.aspx
  7.    $version = [System.Version]( (Get-CimInstance Win32_OperatingSystem).Version )
  8. } catch {
  9.    # For Powershell v1 and v2.
  10.    # .NET Framework: System.Version Class
  11.    # https://msdn.microsoft.com/en-us/library/system.version%28v=vs.110%29.aspx
  12.    $version = [System.Environment]::OSVersion.Version
  13. }
  14.  
  15. $version | Format-List

(https://i.imgur.com/kRiTQZb.png)

nota: la solución tiene en cuenta la obsolescencia de la API para obtener la versión de Windows a partir de Windows 8.1.

Aquí te muestro un ejemplo más extenso:
Código
  1. [System.Version]$version = $null
  2.  
  3. try {
  4.    # As of Powershell v3.
  5.    # WMI: Win32_OperatingSystem Class
  6.    # https://msdn.microsoft.com/en-us/library/aa394239%28v=vs.85%29.aspx
  7.    $version = [System.Version]( (Get-CimInstance Win32_OperatingSystem).Version )
  8. } catch {
  9.    # Powershell v1 and v2.
  10.    # .NET Framework: System.Version Class
  11.    # https://msdn.microsoft.com/en-us/library/system.version%28v=vs.110%29.aspx
  12.    $version = [System.Environment]::OSVersion.Version
  13. }
  14.  
  15. # Wikipedia: List of Microsoft Windows versions
  16. # https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions
  17. switch ($version.Major) {
  18.    10 {
  19.        Write-Host "Windows 10"
  20.  
  21.    } 6 {
  22.        switch ($version.Minor)  {
  23.            3 {
  24.                Write-Host "Windows 8.1"
  25.            } 2 {
  26.                Write-Host "Windows 8"
  27.            } 1 {
  28.                Write-Host "Windows 7"
  29.            } default {
  30.                Write-Host "Windows VISTA"
  31.            }
  32.        }
  33.  
  34.    } 5 {
  35.        switch ($version.Minor)  {
  36.            2 {
  37.                Write-Host "Windows XP"
  38.            } 1 {
  39.                Write-Host "Windows XP"
  40.            } default {
  41.                Write-Host "Windows 2000"
  42.            }
  43.        }
  44.  
  45.    } default {
  46.        Write-Host "Not supported Windows version."
  47.  
  48.    }
  49. }
  50.  
  51. Exit(0)

Saludos.