Lotes de secuencias de comandos de la pregunta - Buscar y reemplazar una variable en una variable?

StackOverflow https://stackoverflow.com/questions/2394208

  •  25-09-2019
  •  | 
  •  

Pregunta

Tengo un problema. Tengo un archivo por lotes que imita el comando cd UNIX. Se toma un camino de tipo UNIX introducido por el usuario, lo guarda como una var llamada upath2, lo convierte en un camino al estilo de Windows y de cd a ese directorio (por ejemplo, "/ archivos de programa / 7-zip" se convertirá en "C: \ archivos de programa \ 7-Zip "). El tipo Windows de salida se guarda como una variable llamada upath2 y el comando de cmd cd ejecutará y el cambio a ese directorio.

Junto con esto "UNIX" comando cd, también han creado un archivo por lotes llamado "bashemu.bat", lo cual me da una fiesta como símbolo. Todos los comandos son entradas DOSKEY, que enlace a la papelera y carpetas usr \ bin que he creado, que contienen todos los comandos .bat. Después ejecuta "cmd / v / k" al final, así que voy a ser capaz de entrar en los alias DOSKEY y poner en marcha todos mis comandos de estilo UNIX.

Ahora, aquí está mi problema: cuando estoy cd-ción a un subdirectorio de mi C: \ Users \ xplinux557 (Almacenado en una variable de entorno llamada "unixhome"), el símbolo de bashemu cambios de:

xplinux557@bash-pc:~$

a, por ejemplo:

xplinux557@bash-pc:/Users/xplinux557/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$

Trazados como éstas son demasiado largos para ser utilizado cómodamente dentro bashemu en el símbolo del sistema, por lo que estoy tratando de obtener el comando cd para leer la variable upath2 completo y comprobar para ver si contiene el camino a casa (como se define por unixhome ) y simplemente reemplazar que con un ~. Esto debe convertir esta:

xplinux557@bash-pc:/Users/xplinux557/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$

en esto:

xplinux557@bash-pc:~/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$

Aaaah, mucho mejor! Mi primer acercamiento fue convertir ruta de tipo UNIX de UPATH a una ruta de Windows-estilo y el nombre de la nueva upath2 var, y sustituir el texto% unixhome% con un "~". Esta era la forma en que se veía un código como:

:: set the batch file to retrieve all text from its parameters and replace all
:: unix-style slashes the user put in and replace those with a windows-style backslash
@echo off
set upath=%*
set upath=%upath:/=\%

:: cd to the directory that the user typed in, windows-style
cd "%upath%"

:: Set the upath2 var to the current directory and replace whatever unixhome was
:: a "~"
set upath2=%cd:%unixhome%="~"%

:: Remove the "C:" or "D:" from the quote
set upath2=%upath2:~2%

:: then, set the prompt to read:
:: "xplinux557@bash-pc:~/Documents/MacSearch_v.1.4.3[1]/Skins/Blue/Icons$"
prompt=%USERNAME%@%USERDOMAIN%:%upath2% $$ 

::EOF

Todo funciona perfectamente bien, a excepción de la línea que dice:

set upath2=%cd:%unixhome%="~"%

Me doy cuenta de que meta la pata y reconoce cd%:% y% = "~" % como variables y me da un mensaje de error. Estoy realmente muy mal por divagando y de esta manera :), pero larga historia corta, hay una manera de tomar el texto de una variable, y reemplazar ese texto si se encuentran en la variable B?

Gracias a todos por adelantado!

¿Fue útil?

Solución

A su vez en la expansión retardada con

setlocal enabledelayedexpansion

y el uso

set upath2=!cd:%userprofile%=~!

Tenga en cuenta que setlocal se iniciará un nuevo ámbito de las variables y los cambios en las variables de entorno hace dentro de ese ámbito, no permanece en el exterior de la misma.

Puede, sin embargo, hacer lo siguiente para un uso de una sola vez:

setlocal enabledelayedexpansion
set upath2=!cd:%userprofile%=~!
endlocal&set upath2=%upath2%

Otros consejos

Se puede hacer un "eval" usando CALL SET:

:: This does not work:  set upath2=%cd:%unixhome%=~%

:: This works: 
:::: uhome is the homepath, with unix-style (forward) slashes 
set uhome=%HOMEPATH:\=/%
:::: ucwd is the current working directory, with unix-style (forward) slashes 
set ucwd=%cd:\=/%

:: replace any occurence of uhome in ucwd with ~
CALL SET ucwd=%%ucwd:%uhome%=~%%

:: strip drive letter and colon
set ucwd=%ucwd:~2%

:: set prompt
prompt=%USERNAME%@%USERDOMAIN%:%ucwd% $$

Cuando llamo a esto consigo User@Machine:~/Documents/dev/batch

PS: Creo que será un error. Usted no quiere %cd:.... ¿Quieres una variable con barras diagonales.

También: esto no va a ser sólida como una roca fiable. Considere el caso de que usted tiene una estructura de directorio siguiente:

  c:\Users\John\Other
  c:\Users\John\Other\Users
  c:\Users\John\Other\Users\John 
  c:\Users\John\Other\Users\John\data 

... en este caso obtendrá 2 twiddles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top