Personalizar Batch

Iniciado por Pédrin-2, 16 Septiembre 2013, 19:02 PM

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

Eleкtro

Citar
Código (dos) [Seleccionar]
Set "FullPath=%CD%\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%%WordCaseName%"

Reemplaza el comando "Set" por "Echo" y mira lo que pasa.

Usa esa técnica para encontrar problemas relacionados con variables (en otros códigos me refiero).

Solución: Set "FullPath=%CD%%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%%WordCaseName%"


Citar
CitarCódigo:
IF /?
esto no lo entiendo

Todos los comandos tienen una sección de ayuda a la que se accede con el switch "/?", escribe en la consola:
IF /?


Saludos








Pédrin-2

 :-[
Sigo idem
Reemplaza el comando "Set" por "Echo" y mira lo que pasa.
No pasa nada

CitarSolución: Set "FullPath=%CD%%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%%WordCaseName%"
aunque la unica diferencia con:
            Set "FullPath=%CD%\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%%WordCaseName%"
es la " \ ", hace lo mismo.

Estoy perdido

Un saludo
Pido disculpas por las pifias que pueda decir. el unico fin es ayudar y aprender.
        Un Saludo

Eleкtro

Cita de: Pédrin-2 en 23 Septiembre 2013, 19:26 PM
la unica diferencia con:
            Set "FullPath=%CD%\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%%WordCaseName%"
es la " \ ", hace lo mismo.

Si exacto esa era la solución, eliminar el caracter del backslash "\".

El code funciona eliminando dicho caracter.

Ejecutas el script, indicas un nombre de carpeta, y la carpeta se crea en el directorio desde donde has ejecutado el script, y por último se abre la carpeta usando el FileExplorer,
si no es ese el funcionamiento que buscas o si es ese pero tienes algún tipo de problema pues creo que va siendo hora de que escribas un comentario DETALLADO mostrando el script tal y como lo tienes, explicando la manera en como estás usando el script y los valores que le das a las variables, en fín información de los pasos a seguir para reproducir el problema que tienes o darte una solución, porque asi no nos entendemos ni uno ni el otro, ya que el code funciona si se usa como se debe usar.

saludos!








Pédrin-2

Con este batch:

@Echo OFF & Setlocal EnableDelayedExpansion

Set /P "Name=Nombre de Cliente:"
Call :ToWordCase "%Name%"

Set "FullPath=%CD%\%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%%WordCaseName%"
REM Set "FullPath=%CD%%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2%%WordCaseName%"

MKDIR "%FullPath%" && (Explorer "%FullPath%")

rem Pause&Exit

:ToWordCase
Set "Alphabet=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
For %%# in (%~1) do (
Set "Word=%%#"
Set "Char=!Word:~0,1!"
If /I "!Char!" EQU "a" (Set "X=%Alphabet:~0,1%")
If /I "!Char!" EQU "b" (Set "X=%Alphabet:~1,1%")
If /I "!Char!" EQU "c" (Set "X=%Alphabet:~2,1%")
If /I "!Char!" EQU "d" (Set "X=%Alphabet:~3,1%")
If /I "!Char!" EQU "e" (Set "X=%Alphabet:~4,1%")
If /I "!Char!" EQU "f" (Set "X=%Alphabet:~5,1%")
If /I "!Char!" EQU "g" (Set "X=%Alphabet:~6,1%")
If /I "!Char!" EQU "h" (Set "X=%Alphabet:~7,1%")
If /I "!Char!" EQU "i" (Set "X=%Alphabet:~8,1%")
If /I "!Char!" EQU "j" (Set "X=%Alphabet:~9,1%")
If /I "!Char!" EQU "k" (Set "X=%Alphabet:~10,1%")
If /I "!Char!" EQU "l" (Set "X=%Alphabet:~11,1%")
If /I "!Char!" EQU "m" (Set "X=%Alphabet:~12,1%")
If /I "!Char!" EQU "n" (Set "X=%Alphabet:~13,1%")
If /I "!Char!" EQU "o" (Set "X=%Alphabet:~14,1%")
If /I "!Char!" EQU "p" (Set "X=%Alphabet:~15,1%")
If /I "!Char!" EQU "q" (Set "X=%Alphabet:~16,1%")
If /I "!Char!" EQU "r" (Set "X=%Alphabet:~17,1%")
If /I "!Char!" EQU "s" (Set "X=%Alphabet:~18,1%")
If /I "!Char!" EQU "t" (Set "X=%Alphabet:~19,1%")
If /I "!Char!" EQU "u" (Set "X=%Alphabet:~20,1%")
If /I "!Char!" EQU "v" (Set "X=%Alphabet:~21,1%")
If /I "!Char!" EQU "w" (Set "X=%Alphabet:~22,1%")
If /I "!Char!" EQU "x" (Set "X=%Alphabet:~23,1%")
If /I "!Char!" EQU "y" (Set "X=%Alphabet:~24,1%")
    If /I "!Char!" EQU "z" (Set "X=%Alphabet:~25,1%")
Set "WordCaseName=!WordCaseName! !X!!Word:~1!"
)


Lo hago funcionar asi:

Teclado en minusculas, click en el archivo bat, escribes; pedro y se crea una carpeta con esta estructura: 2013-09-23 Pedro
hasta aqui esta perfecto.
Teclado con mayusculas, click en el archivo bat, escribes; PEDRO y se crea una carpeta con esta estructura: 2013-09-23 PEDRO.
Y es aqui donde esta el fallo tendria que salir Pedro.

Yo creia que ya lo habias entendido, Creo que ahora entiendo tus intenciones.

¿Quieres que la carpeta "Cliente" se cree en el mismo directorio desde donde abres el script , no?



perdona si no me he expresado bien

Un saludo
Pido disculpas por las pifias que pueda decir. el unico fin es ayudar y aprender.
        Un Saludo

Eleкtro

#34
Cita de: Pédrin-2 en 23 Septiembre 2013, 21:58 PM
Yo creia que ya lo habias entendido, Creo que ahora entiendo tus intenciones.

yo también lo creí, pero si corrijo una parte y me dices "sigue igual", yo no sé a que parte del código te estás refiriendo como comprenderás.

Entonces la parte importante funciona, solo que quieres perfeccionar el método del TitleCase (o ProperCase) para que trabaje todo tipo de variantes de strings, ok

Lo que debes hacer antes de trabajar el string es convertirlo a lowercase, es decir, todo a letras minúsculas, y así solo tendrás que convertir la primera letra del string a mayúscula.

Lo siento pero no voy a seguir ayudándote a hacerlo en Batch, ya que es una tarea horrible y una pérdida de tiempo por la cantidad de código adicional que requieren este tipo de funciones en Batch,
el resultado es un código  ¡¡ tan sucio !!, pero no te confundas, yo amo Batch porque es lo primero que aprendí, solo es que no me apetece perder el tiempo cuando puedo hacer lo mismo en otros lenguajes con mayor precisión, de manera más simplificada y con mejor legibilidad de la estructura del código.

...Y no he dicho que no te vaya a ayudar a hacer la tarea en otro lenguaje! :)

Te voy a codear la tarea en vbs para que aprecies la diferencia entre la incapacidad de Batch y la virtuosidad de los demás lenguajes (y también porque ya estoy un poco hasta las pe...zuñas de las 3 páginas de este hilo xD), aquí tienes pero no te acostumbres!:

Código (vb) [Seleccionar]
' ClientFolderOfDay Script, por .:: Elektro H@cker ::. ...Para los usuarios de ElHacker.Net

Set Shell = WScript.CreateObject ("WScript.Shell")

Do Until Not FolderName=""
   FolderName = StringToTitleCase( _
                InputBox ("Escribe el nombre de la carpeta o cliente:", _
                          "ClientFolderOfDay by .:: Elektro H@cker ::."))
Loop

FullPath = Shell.CurrentDirectory & "\" & _
          (Year(Date) & "-" & DateDigitLen(Month(Date)) & "-" & DateDigitLen(Day(Date))) & _
           " " & FolderName

CreateObject("Scripting.FileSystemObject").CreateFolder FullPath
Shell.run "Explorer.exe """ & FullPath & """", 1, False
Wscript.Quit(0)

' Funcs:
Function StringToTitleCase(str)
   StringToTitleCase=UCase(Left(str,1)) & LCase(Right(str,Len(str)-1))
End Function

Function DateDigitLen(PortionOfDate)
   If(Len(PortionOfDate)=1) Then
      DateDigitLen="0" & PortionOfDate
   Else
      DateDigitLen=PortionOfDate
   End If
End function



PD1: Guarda el script con extensión "VBS" y ejecútalo de la misma manera como si se tratase de un archivo Bat.

PD2: Si piensas llamar al script desde el registro entonces en el valor de la clave "command" que generes debes agregar los siguientes datos:
"Wscript.exe "Folderclient.vbs""


Saludos








Pédrin-2

Hola EleKtro H@cker
De verdad que lamento muchisimo tu malestar sobre mi post.

Nunca quise que te sintieras tan molesto conmigo, el gran problema que tenemos las personas es que cuando sabemos en un tema, nos creemos que los demas estan a nuestra altura, y cuando un asunto sale mal por la ley de Murphy en la mayortia de los casos va a peor.

Te recuerdo que soy como un niño que se le esta enseñando a caminar, por lo tanto mis conocimientos son muy, muy, muy basicos.

Sobre el tema de si lo haces en un lenguaje o en otro me da igual, el hecho de hacerlo en batch, es porque una persona muy amble como tu, quiso perder su tiempo para ayudarme, y me proporciono el batch, y hasta la fecha no se me ha ocurrido mejorarlo, por eso despues de muchos intentos y busquedas por google no lo he podido solucionar y he tenido que recurrir a este foro.

Si crees conveniente lo dejamos aqui, y sigo con el codigo hasta la parte que funciona y ya me ire fijando de no escribir en mayusculas.

o corriges este ultimo en un nombre compuesto la segunda palabra no se pone en mayusculas: ( Pedro juan, en vez de Pedro Juan )

De hecho me gusta mas tu input box, que esa ventana cmd

Lo dicho, si lo corriges bien sino se acaba el .... hilo.

Un saludo.

PD espero que no te haya sentado mal mi opinion
Pido disculpas por las pifias que pueda decir. el unico fin es ayudar y aprender.
        Un Saludo

Eleкtro

#36
@Pedrin-2

No me hagas sentir mal, si digo que estoy un poco harto del tema es en plan broma para no crear tensiones, porque veo 3 páginas con scripts para intentar arreglar un único problema y me descojo..., no te pongas tenso tú ahora xD, a mi me gusta ayudar a quien quiere aprender un poco y es por una de las razones que modero varios foros, no te preocupes por eso que no cierro temas sin tener un buen motivo ni tampoco me ha molestado tu comentario.

Cita de: Pédrin-2 en 24 Septiembre 2013, 11:30 AMo corriges este ultimo en un nombre compuesto la segunda palabra no se pone en mayusculas: ( Pedro juan, en vez de Pedro Juan )

En principio no es un error, si te fijas la función se llama TitleCase, no WordCase, ya que no tuve en cuenta que querías poner en mayúscul la letra principal de TODAS las palabras (quizás es obvio tratándose de "nombres de clientes", pero si no me lo especificas  pues tampoco lo hago de esa manera).

Tiene facil arreglo:

Reemplazas la función StringToTitleCase por esta otra:

Código (vb) [Seleccionar]
   Function StringToWordCase(str)
      For each word in Split(str)
         StringToWordCase=StringToWordCase & _
                          " " & UCase(Left(word,1)) & LCase(Right(word,Len(word)-1))
      Next
   End Function


Y llamas a la función en esta otra linea:
Citar
Código (VB) [Seleccionar]
FolderName = StringToWordCase( ...

¿Solucionado por fín? xD

Saludos








Pédrin-2

#37
Si por fin ya esta solucionado,  ;-)

Te puedo comentar algo para mejorarlo,  >:D  he visto algo, que no es un fallo pero le faltaria ese detalle.

Sigues animado??

Pd
Ya que me recomiendas un editor que no sea de pago,

Un saludo
Pido disculpas por las pifias que pueda decir. el unico fin es ayudar y aprender.
        Un Saludo

Eleкtro

¿A que te refieres?, si lo dices por el búcle del inputbox, no se puede mejorar mucho más ya que solamente retorna el string, si quieres que al cancelar el input no vuelva a salir, pues elimina el búcle xD.

Como editor de texto te recomiendo Sublime Text 3, si vas a trabajar VBS primero debes instalarte uno de los varios plugins de vbs que puedes encontrar en el foro de la web del programa.

Saludos!








Pédrin-2

Veo que sabes por donde van las preguntas.

Te lo explico a mi manera:
Si ejecuto el script y quiero; cancelar, aceptar sin poner nada, o cerrar es imposible que se cierre, tan solo se cierra cuando se ecribe, creo que esta opcion ya la habias barajado.

Si es asi, y me dices que quite el bucle, entiendo como bucle ( loop ), si lo quito junto a su  ( Do Until Not ), pasa lo siguiente:

En una carpeta vacia, solo script, ejecuto script, se abre inputbox, si le doy a cerrar se cierra pero se abre un carpeta con la fecha de hoy.
y apartir de aqui ya no se puede hacer nada da error ( el archivo ya existe ), si borras la carpeta te deja , cerra, aceptar en blanco, o cancelar, pero siempre te crea la carpeta con la fecha actual.

Te pediria por favor, ya que doy por hecho, que sabes la respuesta, me pegaras todo el codigo .vbs, para asi no estar como hemos estado paginas atras.

Y por favor compruebalo, y asi seguro que lo que escribas sera el definitivo, y el tema lo damos por terminado.

Un saludo

PD
Espero haberme explicado bien


Pido disculpas por las pifias que pueda decir. el unico fin es ayudar y aprender.
        Un Saludo