comando por lotes para almacenar el nombre de una carpeta en un archivo en una sola línea
1
Tengo una lista de carpetas en un directorio, necesito copiar todo el nombre de la carpeta en un archivo y el archivo debe estar en una sola línea separada por delim. ¿Puede alguien ayudarme con esto en un archivo por lotes?
@SivaCharan no es tan simple, ya que echo produce una nueva línea.
barlop
El comando echo integrado en cmd.exe no lo admite, pero los ecos incorporados en los shells de Unix agregan una -nopción que suprime la nueva línea final.
Nicole Hamilton
Respuestas:
1
En lote lo harías así:
@echo off
setlocal EnableDelayedExpansion
for /D %%f in (*.*) do set n=!n!;%%f
if defined n echo %n:~1% > list.txt
endlocal
Para recurrir a subcarpetas, reemplace /Dcon /Ry *.*con ..
for /R %%f in (.) do set n=!n!;%%f
Al agregar calificadores a la variable de bucle, puede especificar si desea solo el nombre de la carpeta ( %%~nxf) o la ruta completa ( %%~dpnxf).
Esto obtiene solo los archivos, sin subdirectorios. Eso podría ser lo que quiso decir el OP, pero interpreté su pregunta (tal vez erróneamente) como pedir lo contrario, solo subdir, sin archivos. Pero todavía te di un voto positivo por hacerlo con cmd.exe.
Nicole Hamilton
Mi error. Olvidé la /Denumeración del directorio. Ahora está arreglado en mi respuesta.
Ansgar Wiechers
0
No hay un solo comando de archivo por lotes que haga lo que desea, pero podría usar un archivo por lotes para realizar la tarea y callhacerlo usted mismo. La respuesta de Ansgar Wiechers tuvo la idea básica correcta (veo que arregló su versión después de que publiqué la mía).
De todos modos, aquí hay una versión que producirá una lista delimitada por punto y coma de subcarpetas de primer nivel en el directorio actual o en uno que se le pase como argumento. Elegí usar un delimitador de punto y coma en lugar de, por ejemplo, una coma, porque nunca podría ser parte de un nombre de archivo válido (y las comas pueden ser, aunque es poco común).
Si un nombre de carpeta dado tiene espacios, debe citarse así (de lo contrario, la ruta del directorio de la carpeta es opcional):
subdirs "C:\Documents and Settings"
Tenga en cuenta que solo imprime la lista en la consola (stdout), por lo que si desea guardar eso en un archivo, deberá agregar un > filename.extdespués del nombre del archivo de script (y cualquier nombre de carpeta) para redirigir la salida al archivo de su elección :
subdirs C:\Windows > dirlist.txt
== subdirs.bat ==
@echo off
setlocal EnableDelayedExpansion
pushd %1
for /D %%d in (*.*) do set n=!n!;%%d
if defined n echo %n:~1%
popd
endlocal
Si desea generar la ruta completa a cada nombre de carpeta, puede cambiar set n=!n!;%%da set n=!n!;%%~fden la forlínea de bucle.
Podría ser más fácil cdingresar al directorio raíz que anteponer el patrón con una ruta:if "%1" neq "" cd "%1"
Ansgar Wiechers
@Ansgar Wiechers: Tienes razón, pero tendrá que guardar y restaurar el directorio actual para que no sea un efecto secundario permanente. Incorporaré eso junto con otra simplificación que he planeado. Gracias por la sugerencia.
Martineau
+1 para pushd. No he usado esto en años.
Ansgar Wiechers
@Ansgar Wiechers: Gracias de nuevo. He simplificado mi respuesta aún más después de darme cuenta de que verificar si se proporcionó un argumento de ruta de carpeta o no fue realmente necesario. También cambié el delimitador a un punto y coma para evitar confusiones con posibles nombres de subcarpetas.
-n
opción que suprime la nueva línea final.Respuestas:
En lote lo harías así:
Para recurrir a subcarpetas, reemplace
/D
con/R
y*.*
con.
.Al agregar calificadores a la variable de bucle, puede especificar si desea solo el nombre de la carpeta (
%%~nxf
) o la ruta completa (%%~dpnxf
).fuente
/D
enumeración del directorio. Ahora está arreglado en mi respuesta.No hay un solo comando de archivo por lotes que haga lo que desea, pero podría usar un archivo por lotes para realizar la tarea y
call
hacerlo usted mismo. La respuesta de Ansgar Wiechers tuvo la idea básica correcta (veo que arregló su versión después de que publiqué la mía).De todos modos, aquí hay una versión que producirá una lista delimitada por punto y coma de subcarpetas de primer nivel en el directorio actual o en uno que se le pase como argumento. Elegí usar un delimitador de punto y coma en lugar de, por ejemplo, una coma, porque nunca podría ser parte de un nombre de archivo válido (y las comas pueden ser, aunque es poco común).
Si un nombre de carpeta dado tiene espacios, debe citarse así (de lo contrario, la ruta del directorio de la carpeta es opcional):
Tenga en cuenta que solo imprime la lista en la consola (stdout), por lo que si desea guardar eso en un archivo, deberá agregar un
> filename.ext
después del nombre del archivo de script (y cualquier nombre de carpeta) para redirigir la salida al archivo de su elección :== subdirs.bat ==
Si desea generar la ruta completa a cada nombre de carpeta, puede cambiar
set n=!n!;%%d
aset n=!n!;%%~fd
en lafor
línea de bucle.fuente
cd
ingresar al directorio raíz que anteponer el patrón con una ruta:if "%1" neq "" cd "%1"
pushd
. No he usado esto en años.