Cadena con " comillas dobles Topic is solved

Esta sección es para preguntas sobre programación/scripting usando AutoHotkey.

Moderator: Flipeador

BlackDraGoN
Posts: 39
Joined: 13 Nov 2022, 09:31

Cadena con " comillas dobles

Post by BlackDraGoN » 01 Oct 2023, 06:27

como ejecutor el siguiente comando:

Run, %Juego% %Parametros%

Pero quiero que %Parametros% vaya entre " comillas dobles ya que la cadena una vez convertida debe de ser algo asi:

Juego.exe "c:\directorio\fichero con espacios.vdx"

No consigo averiguar como y me estoy volviendo loco.

sofista
Posts: 654
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Cadena con " comillas dobles

Post by sofista » 01 Oct 2023, 07:56

Me pregunto para qué querrías las comillas en el parámetro. Quizás el problema se deba a una mezcla de las sintaxis "Legacy" y "Expressions".

Todas estas versiones funcionan correctamente:

Code: Select all

run, notepad.exe D:\Pruebas\Sintaxis del comando Run.txt

fichero  := "D:\Pruebas\Sintaxis del comando Run.txt"
run, notepad.exe %fichero%

programa := "notepad.exe"
fichero  := "D:\Pruebas\Sintaxis del comando Run.txt"
run, %programa% %fichero%

; o también todo en legacy syntax, aunque no recomendada:

programa = notepad.exe
fichero  = D:\Pruebas\Sintaxis del comando Run.txt
run, %programa% %fichero%
Si ninguna de estas variantes te funciona bien, sube el código que estás usando.

BlackDraGoN
Posts: 39
Joined: 13 Nov 2022, 09:31

Re: Cadena con " comillas dobles

Post by BlackDraGoN » 01 Oct 2023, 11:35

@sofista
Lo que hago es pasar los Argumentos recibidos de array a cadena, y luego llamo a un ejecutable y se los paso, pero cuando la cadena tiene una ruta de fichero con algún espacio en el nombre, pues falla, ya que si pongo "" en la variable también falla, puesto que si hay algún parámetro que no es una ruta Falla. Que puedo hacer para que cuando convierto lo que recibo a cadena pueda saber si es una ruta y en ese caso poner a ese argumento "", pero sino es una ruta q lo deje normal.

sofista
Posts: 654
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Cadena con " comillas dobles

Post by sofista » 01 Oct 2023, 12:15

Es probable que el problema se encuentre en el ejecutable que mencionas, porque cargar ficheros con rutas guardadas en un array funciona bien. Ej.:

Code: Select all

arr := [ "D:\Pruebas\Prueba de ruta con espacios 1.txt"
	   , "D:\Pruebas\Prueba de ruta con espacios 2.txt"
	   , "D:\Pruebas\Prueba de ruta con espacios 3.txt" ]

For k, v in arr {
	run, notepad.exe %v%
}
Como te pedí antes, publicá el código que estás usando, de otra manera es difícil que pueda ayudarte más.

BlackDraGoN
Posts: 39
Joined: 13 Nov 2022, 09:31

Re: Cadena con " comillas dobles

Post by BlackDraGoN » 01 Oct 2023, 14:38

@sofista
Como puedo enviar todos los argumentos que recibo a otro programa. Los argumentos pueden ser una opción o una dirección a un fichero con o sin espacios por medio. Como ejemplo;

Vpinball.exe /play d:\directorio con espacio\directorio\fichero.vbx

sofista
Posts: 654
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Cadena con " comillas dobles

Post by sofista » 01 Oct 2023, 18:48

No tengo ese programa, así que doy tres ejemplos con Notepad++. Supongamos que quiero abrir un archivo y que el cursor se coloque de inicio en la línea 4. Haría de la siguiente manera (la dificultad está en los escapes de las comillas):

Code: Select all

; Expressions syntax, incluye la ruta del fichero
run, % "notepad++.exe -n4 ""D:\Pruebas\Prueba de ruta con espacios 1.txt"""

; Expressions syntax, paso la ruta del fichero como variable
fichero := """D:\Pruebas\Prueba de ruta con espacios 1.txt"""
run, % "notepad++.exe -n4 " fichero

; Legacy syntax, paso la ruta del fichero como variable
fichero := """D:\Pruebas\Prueba de ruta con espacios 1.txt"""
run, notepad++.exe -n4 %fichero%

BlackDraGoN
Posts: 39
Joined: 13 Nov 2022, 09:31

Re: Cadena con " comillas dobles

Post by BlackDraGoN » 02 Oct 2023, 06:14

@sofista

Code: Select all

Parametros := ArrayToStr(A_Args, " ")

RunAsAdmin(Parametros)
if A_IsAdmin {
    MsgBox, Script en modo Administrador con parametros %Parametros%
} else {
    MsgBox, Script en modo Normal con parametros %Parametros%
}

Run, Vpinball.exe %Parametros%

RunAsAdmin(RParametros=""){
    if not A_IsAdmin {
        if A_IsCompiled
            Run *RunAs "%A_ScriptFullPath%" "%RParametros%"
        else
            Run *RunAs "%A_AhkPath%" "%A_ScriptFullPath%" "%RParametros%"
        ExitApp
    }
}

ArrayToStr(Array, Separacion=" "){
    local Str := ""
    For Index, Value In Array {
        Str .= Value . Separacion
    }
    Str := RTrim(Str, Separacion)
    return Str
}
Ese es mi codigo, el problema es que asi como esta, si yo lo ejecuto de la siguiente forma: Miprograma.exe /play d:\directorio con espacio\directorio\fichero.vbx

Cuando vuelvo a llamar al programa para ponerlo en modo Administrador, me da un fallo, puesto que corta el directorio por el primer espacio en blanco. Y yo lo que quiero es que envie lo siguiente:
Vpinball.exe /play d:\directorio con espacio\directorio\fichero.vbx ---> Me da fallo porque coge cada espacio como si fuese un argumento pasado

Vpinball.exe /play "d:\directorio con espacio\directorio\fichero.vbx" --> Esto es lo correcto y lo que busco hacer, que cuando sea una ruta, la ponga entre comillas dobles.

Con la ruta entre comillas dobles, y no todo. Si pongo Run, Vpinball.exe %Parametros% de la siguiente forma Run, Vpinball.exe "%Parametros%" me da error porque haria lo siguiente Vpinball.exe "/play d:\directorio con espacio\directorio\fichero.vbx" , meteria entre comillas tambien el /play y solo quiero la ruta.

sofista
Posts: 654
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Cadena con " comillas dobles

Post by sofista » 02 Oct 2023, 13:34

Queda claro por qué el código que subiste no funciona correctamente, pues la función ArrayToStr toma los elementos de un array y los concatena separándolos con un espacio. En ninguna línea se intenta siquiera colocar comillas donde corresponde, tal como te mostré en mi anterior mensaje.

De ahí que se corte el directorio en el primer espacio. Sugiero que hagas algo como esto —sólo cambié el separador para que se note bien el encomillado—:

Code: Select all

arr := [ "Miprograma.exe /play d:\directorio con espacio\directorio\fichero1.vbx"
	   , "Miprograma.exe /play d:\directorio con espacio\directorio\fichero2.vbx"
	   , "Miprograma.exe /play d:\directorio con espacio\directorio\fichero3.vbx" ]

ArrayToStr2(arr, Separacion := " ") {
	Str := ""
	For Index, Value in arr {
		RegExMatch(value, "i)^(.+)([A-Z]:\\.+)$", m)
		Str .= m1 Chr(34) m2 Chr(34) Separacion
	}
	Str := RTrim(Str, Separacion)
	return Str
}

MsgBox, % ArrayToStr2(arr, "`n")

/* Output:

Miprograma.exe /play "d:\directorio con espacio\directorio\fichero1.vbx"
Miprograma.exe /play "d:\directorio con espacio\directorio\fichero2.vbx"
Miprograma.exe /play "d:\directorio con espacio\directorio\fichero3.vbx"

 */
Por último, sugiero que leas en el AutoHotkey Help las diferencias entre las sintaxis legacy y la de expresiones, cuándo corresponde usar una y cuándo la otra. Comprender estos conceptos y usos en crucial para mejorar el código propio y el escrito por otros desarrolladores.

Buena suerte con tu proyecto.

Guest

Re: Cadena con " comillas dobles

Post by Guest » 03 Oct 2023, 02:47

sofista wrote:
02 Oct 2023, 13:34

Por último, sugiero que leas en el AutoHotkey Help las diferencias entre las sintaxis legacy y la de expresiones, cuándo corresponde usar una y cuándo la otra. Comprender estos conceptos y usos en crucial para mejorar el código propio y el escrito por otros desarrolladores.

Buena suerte con tu proyecto.
Podrias indicarme el enlace, en la ayuda no encuentro ese apartado, perdona pero mi ingles no es muy bueno.

BlackDraGoN
Posts: 39
Joined: 13 Nov 2022, 09:31

Re: Cadena con " comillas dobles

Post by BlackDraGoN » 03 Oct 2023, 02:49

sofista wrote:
02 Oct 2023, 13:34
Por último, sugiero que leas en el AutoHotkey Help las diferencias entre las sintaxis legacy y la de expresiones, cuándo corresponde usar una y cuándo la otra. Comprender estos conceptos y usos en crucial para mejorar el código propio y el escrito por otros desarrolladores.

Buena suerte con tu proyecto.
Perdona pero mi ingles no es muy bueno, podrias pasarme el enlace de donde se encuentra esa ayuda. No consigo verla.

Mil Gracias por tu ayuda.

sofista
Posts: 654
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Cadena con " comillas dobles  Topic is solved

Post by sofista » 03 Oct 2023, 08:00

BlackDraGoN wrote:
03 Oct 2023, 02:49
sofista wrote:
02 Oct 2023, 13:34
Por último, sugiero que leas en el AutoHotkey Help las diferencias entre las sintaxis legacy y la de expresiones, cuándo corresponde usar una y cuándo la otra. Comprender estos conceptos y usos en crucial para mejorar el código propio y el escrito por otros desarrolladores.

Buena suerte con tu proyecto.
Perdona pero mi ingles no es muy bueno, podrias pasarme el enlace de donde se encuentra esa ayuda. No consigo verla.

Mil Gracias por tu ayuda.
Sí, por supuesto. Esa información está aquí: Expressions vs. Legacy Syntax .

En caso de dificultades con el idioma, podrías usar el servicio de traducción de DeepL .

Post Reply

Return to “Pedir Ayuda”