Tengo un directorio con un conjunto de subcarpetas que coinciden con un patrón de nombre, como:
sub-123
sub-0815
sub-4711
Dentro de estas carpetas tengo algunos archivos con el mismo número en el nombre que se encontró en el nombre de la carpeta. por ejemplo, la carpeta sub-123 contiene los archivos
input-123
output-123
Quiero iterar la carpeta, cambiar el directorio de trabajo a la carpeta actual y realizar algún procesamiento con el conjunto de archivos apropiado. Si bien puedo iterar las carpetas con
for /d %%d in (sub-*) do .
Necesito la parte del nombre de la carpeta que coincide con el asterisco, en el ejemplo anterior "123". ¿Cómo puedo extraer el 123 del nombre de la carpeta y crear un comando como
cd sub-123
copy input-123 output-123
¿Dentro de un archivo por lotes de Windows-7? En el entorno Linux, es posible utilizar el comando cortar o cualquier expresión regular. Pero, ¿cómo debo acceder al símbolo del sistema de Windows?
Respuesta1
Lo encontré yo solo. El comando set tiene una sustitución de variables mejorada. Pero no se puede utilizar en el for
propio cuerpo. Es necesario iniciar un nuevo contexto de llamada bath:
for /d %%d in (sub-*) do (
set item=%%d
pushd %%d
call :build
popd
)
goto :eof
:build
set item=%item:sub-=%
copy input-%item% output-%item%
:eof
El "elemento" no se construye exactamente a partir de la cadena que coincide con el asterisco, pero es equivalente.
Respuesta2
También encontré una respuesta directa. Está cerca del corte semántico.
El comando set también tiene una sintaxis de subcadena. Para omitir n caracteres utilice %variable:~n%
. Para obtener n caracteres comenzando en el desplazamiento k use%variable:~k,n%
for /d %%d in (sub-*) do (
set item=%%d
set num=%item:~4%
pushd %%d
copy input-%num% output-%num%
popd
)