Personalizar Batch

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

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

Pédrin-2

Hola de nuevo.
Desde hace mucho tiempo un buen conocedor del tema me hizo un batch, creo que era Martin MVP.
Me ha funcionado ciento por ciento.
y ahora me gustaria tunearlo, de momento, el cambio que he hecho, es que le pueda agregar ademas de la fecha ,el nombre que quiera, y tambien que esa misma carpeta se abra.
Pues el tema es que la carpeta se crea y cuando quiere se abre y cuando quiere no se abre, "muy contento estaba yo al ver que funcionaba".
Porfi me echais un cable donde me atasque,

El codigo:
@echo off
set/p nombre="Nombre:"
set nombre=%nombre%
set guion=-
for /f "tokens=1,2,3,4 delims=/" %%i in ('date /t') do (
set ano=%%k
set dia=%%i
set mes=%%j
set nombre=%nombre%)
set cadena=%ano%%guion%%mes%%guion%%dia% %nombre%
set directorio=%1


start cmd.exe /c "CD %directorio% && Md """%cadena%""""

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

Eleкtro

#1
No me ha quedado muy claro si quieres pasarle el nombre del directorio usando argumentos (%1) o preguntando al usuario, en total intentas setear 3 variables, nombre, directorio, y cadena, si no nos cuentas lo que debe haber en cad auna de ellas...
Por lo que yo entiendo quieres pasarle un directorio por argumentos, y leugo especificar un nomrbe de carpeta manuálmente para ese directorio.

...Símplemente te sugiero como corregir tu script, lo de las variables ya lo ajustas tu:

Código (dos) [Seleccionar]
@echo off

:: Aquí las comillas dobles siempre encerrando tanto el nombre de la variable como el valor,
:: nunca encierres el valor con comillas, nunca.
Set /P "nombre=Nombre:"

:: 1. Esto sobra complétamente, arriba ya declaras una variable que se llama "nombre" y que contiene el valor que quieres
:: 2.Además aquí te faltó usar comillas dobles para evitar errores si el valor contuviese espacios.
REM set Nombre=%nombre%

:: Esto diréctamente en mi opinión sobra,
:: no cuesta nada escribir el símbolo del guión.
:: Esta variable consigue que el código de abajo sea menos legible.
REM set guion=-

:: Esta parte se puede simplificar sin la necesidad de establecer nuevas variables
REM for /f "tokens=1,2,3,4 delims=/" %%i in ('date /t') do (
REM set ano=%%k
REM set dia=%%i
REM set mes=%%j
REM set nombre=%nombre%)
:: Pero si prefieres almacenar los valores en nuevas variables puedes hacerlo así
Set "YYYY=%DATE:~6,4%" & Set "DD=%DATE:~0,2%" & Set "MM=%DATE:~3,2%"

:: Aquí te faltó usar comillas dobles para encerrar el valor.
set "cadena=%YYYY%-%MM%-%DD% %nombre%"

:: El parámetro especial %1 contiene comillas dobles al principio y al final,
:: así que estás encerrando el valor como comenté que no habia que hacerlo nunca.
set "Directorio=%~1"

:: 1. Le falta comillas dobles al argumento de la variable "%Directorio%""
:: 2. La variable %cadena% tiene demasiadas comillas dobles que entran en conflicto con el argumento encerrado de la CMD.
REM start cmd.exe /c "CD %directorio% && Md """%cadena%""""

:: Crea la carpeta diréctamente sin acceder al directorio.
MKDir "%directorio%\%cadena%"

Explorer /select,"%directorio%\%cadena%"
:: NOTA: Fíjate en la barra invertida entre las dos variables,
::       asgúrate de setear el valor de la variable %directorio% sin esa barra al final del nombre.

:: Saludos :)
Pause&Exit




EDITO:

La versión corta:

Código (dos) [Seleccionar]
@echo off

Set /P "nombre=Nombre:"
Set "YYYY=%DATE:~6,4%" & Set "DD=%DATE:~0,2%" & Set "MM=%DATE:~3,2%"
set "cadena=%YYYY%-%MM%-%DD% %nombre%"
set "Directorio=%~1"

MKDir "%directorio%\%cadena%"
Explorer /select,"%directorio%\%cadena%"

Pause&Exit


Saludos








Pédrin-2

#2
Jo perdona mucho corria sin dar explicaciones.
El batch tiene que crear una carpeta, con la fecha en la que es creada, pero ademas se tiene que poner otro nombre, ejemplo:  2013 -09-16 Pablo

y por ultimo la carpeta recien creada se tiene que abrir {en el mismo sitio donde esta el batch, (o que yo le indique la ruta donde quiro que se abra) }


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

Pédrin-2

Hola  EleKtro H@cker, por mas vueltas que le doy no consigo nada con tu codigo.
El codigo original antes de yo transformalo era asi:

echo off
set guion=-
for /f "tokens=1,2,3 delims=/" %%i in ('date /t') do (
set ano=%%k
set dia=%%i
set mes=%%j)
set cadena=%ano%%guion%%mes%%guion%%dia%
set directorio=%1
start cmd.exe /c "CD %directorio% && Md """%cadena%""""


y yo lo dejo como ya puse antes:

@echo off
set/p nombre="Nombre:"
set nombre=%nombre%
set guion=-
for /f "tokens=1,2,3,4 delims=/" %%i in ('date /t') do (
set ano=%%k
set dia=%%i
set mes=%%j
set nombre=%nombre%)
set cadena=%ano%%guion%%mes%%guion%%dia% %nombre%
set directorio=%1


start cmd.exe /c "CD %directorio% && Md """%cadena%""""

START EXPLORER %cadena%


y el unico problema que hay, " por el tema de codigo ignoro que este bien, pero funciona"     es que unas veces abre la carpeta y la mayoria de las veces abre la carpeta de mis documentos.
Pido disculpas por las pifias que pueda decir. el unico fin es ayudar y aprender.
        Un Saludo

Eleкtro

#4
@Pedrín-2

Porfavor vuelve a leer los comentarios que te dejé escritos en el script,
Te comenté cual es el problema exacto aquí:

START EXPLORER %cadena%

La variable, es decir, el argumento de la ruta de acceso, debes encerrarlo usando comillas dobles:

Código (dos) [Seleccionar]
Explorer.exe /select,"%cadena%"






Supongamos que el valor de la variable cadena es este:
Código (dos) [Seleccionar]
Set "Cadena=C:\Carpeta con espacios"

Entonces si tu haces esto:
Código (dos) [Seleccionar]
Explorer.exe %Cadena%
(Que es lo mismo que hacer esto:)
Código (dos) [Seleccionar]
Explorer.exe C:\Carpeta con espacios

Estás pasándole 3 argumentos al proceso:
1. C:\Carpeta
2. con
3. espacios


Como el explorer.exe no puede encontrar el directorio especificado (Primer argumento: "C:\Carpeta") entonces por defecto te redirige a la localización de "mis documentos".

Pero si tu haces esto otro:
Código (dos) [Seleccionar]
Explorer.exe "%cadena%"
(Que es lo mismo que hacer esto:)
Código (dos) [Seleccionar]
Explorer.exe "C:\Carpeta con espacios"

Ahora le estás pasando un único argumento y te va a abrir la localizión del directorio especificado (siempre que el directorio exista):
C:\Carpeta con espacios



NOTA: Lo de las comillas dobles debes aplicarlo a "TODO".



un saludo








Pédrin-2

Un millon de gracias EleKtro H@cker.
De momento va bien, y digo de momento porque no se que carajo pasa que a veces falla.
Siguo investigando para poder mejorarlo, pronto me tienes con mas dudas.

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

Pédrin-2

Hola EleKtro H@cker
Porque me esta dando errores el Batch.
A veces, cuando pongo el nombre, por ejemplo Juan, me abre la carpeta de mis documentos, la cierro y ejecuto de nuevo, poniendo el mismo nombre y es a la segunda cuando funciona.

Al batch se puede añadir:
1º  si hay otra carpeta con el mismo nombre que se le vaya sumando por ejemplo: 2013 -08-12 Juan-1, 2013 -08-12 Juan-2, 2013 -08-12 Juan-3 etc, se que en action script se puede hacer, aqui ya me pierdo, no se como adaptarlo.

2º que todas las palabras comiencen por mayusculas: 2013 -08-12 Juan Manuel. se que en excel se hace

Demasiado estoy pidiendo, pero para hacerlo yo, me esta costando un mundo, estoy dando palos de ciego.

Disculpa por el morro
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 17 Septiembre 2013, 22:32 PMA veces, cuando pongo el nombre, por ejemplo Juan, me abre la carpeta de mis documentos, la cierro y ejecuto de nuevo, poniendo el mismo nombre y es a la segunda cuando funciona.

Si eso es así entonces puede que estés creando la carpeta después de llamar al explorer y no antes?

Lo de incrementar el sufijo del nombre de la carpeta, sólamente tienes que hacer un substring, es muy sencillo: http://ss64.com/nt/syntax-substring.html

hoy no tengo mas tiempo, si no se me adelanta algún compañero mañana te muestro lo de poner las letras en WordCase, que eso requiere un poco más de elaboración.

Saludos








Pédrin-2

#8
Cita de: EleKtro H@cker en 17 Septiembre 2013, 23:52 PM

Si eso es así entonces puede que estés creando la carpeta después de llamar al explorer y no antes?


Plis y como se hace

Cita de: EleKtro H@cker en 17 Septiembre 2013, 23:52 PM

Lo de incrementar el sufijo del nombre de la carpeta, sólamente tienes que hacer un substring, es muy sencillo: http://ss64.com/nt/syntax-substring.html


Bien, eso es lo que andaba buscando, pasos a seguir para ir practicando, no ir dando palos de ciego.

Habia yo, pensado que  tendria que haber algun un programa para traducir la sentencia , estilo google translate, ejem:

elige lenguaje: Visual basic, java, batch, etc...
escribe lo que quieres: como poner todas las palabras en minuscula en las columnas 19 y 20.
.......pensando
Respuesta a lenguaje Visual basic:  If Target.Column = 19 Or Target.Column = 20 Then Target = LCase(Target)

Je, Je, y de paso que nos diga los numeros de la loteria.

Un saludo y Buenas Noches si estas en Spain
Pido disculpas por las pifias que pueda decir. el unico fin es ayudar y aprender.
        Un Saludo

Eleкtro

Código (dos) [Seleccionar]
@Echo OFF
Setlocal EnableDelayedExpansion

Call :ToWordCase "hello world"

Echo+
Pause&Exit

:ToWordCase
Set "Alphabet=ABCDEFGHIJKLMNOPQRSTUVWXYZ"

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

GOTO:EOF


Así lo hice en Batch,
saludos!