Ocasionalmente, la incapacidad del cmd shell para expandir las rutas comodín puede ser realmente un inconveniente. Tuve que pasar 100 archivos en un directorio a un programa, y no pude escribir * .ext. En cambio, utilicé 'ls' de mingw para volcar la lista en un archivo, luego reemplacé las nuevas líneas con espacios, las copié y pegué en cmd. Toda una pesadilla.
Sospecho que la respuesta será no, pero ¿alguien se ha ocupado de esto o ha encontrado alguna forma de facilitarlo?
windows-7
command-line
wildcards
batch
cemulate
fuente
fuente
I suspect the answer will be no, but has anyone dealt with this or come up with any way to make this easier?
En realidad, estoy teniendo el problema opuesto, estoy tratando de encontrar una manera de hacer que el intérprete de comandos trate su lista como cadenas y evite que las convierta en comodines. Por ejemplo,for %i in (foobar baz really?) do @echo %i
tratará el último elemento (really?
) como un comodín nombre de archivo y saltar si no existen archivos con el nombrereally1
,reallyz
etc. ☹?
no es un carácter legal para los nombres de archivo en el sistema de archivos de Windows. El personaje solo puede interpretarse como un comodín. Consulte Nombrar archivos, rutas y espacios de nombres en MSDN y Usar caracteres comodín en TechNet.Respuestas:
DOS, y en consecuencia Windows '
cmd.exe
, nunca admitieron la expansión de comodines por parte del shell. Siempre dependía de la aplicación hacer la expansión.Esto significa que siempre tendrá que encontrar otra ruta si está utilizando una aplicación que no admite la expansión. Tú podrías:
dir /b > list.txt
para usar eldir
comando para realizar la expansión y coloque la lista de archivos en un archivo de texto (luego puede usar algo como una fórmula de Excel si realmente está desesperado por producir una lista de comandos para pegarcmd
, o puede usar Excel para transponer las celdas de modo que todos los nombres de archivo estén en la misma línea).fuente
Simplemente use Powershell, que está preinstalado en Windows 7. Powershell es capaz de ejecutar comandos cmd y entiende los comodines en cualquier lugar de una ruta.
Para iniciar Powershell, simplemente escriba "powershell" en el cuadro de búsqueda del menú de inicio y presione Intro.
En caso de que la aplicación espere una cadena con todos los nombres de archivo, esta es la secuencia de comandos correcta:
Cambie
$delimiter = " "
a$delimiter = ","
si su aplicación espera una lista de nombres de archivos separados por comas.Explicación del código:
[string]$files = $nothing
- crea una variable de tipo vacíastring
;
- ¡es un separador para múltiples comandos, no una tubería!ls *.txt | % { $files += $_.fullname + $delimiter }
- obtiene una lista de todos los archivos de texto y crea una cadena con todos los nombres de archivo separados por el delimitadorapplication.exe $files
- llama a la aplicación y le pasa la lista de archivosIncluso puede buscar un patrón de archivo de forma recursiva agregando
-recurse
parals *.txt
que el código completo se vea así:Editar:
para evitar irritaciones,
ls
ydir
son alias deGet-ChildItem
y%
es un alias paraForEach-Object
. Mantengo mi código con alias usados porque es más corto.EDITAR 25/04/2018:
en 2012 he sido bastante nuevo en PowerShell. Por supuesto, hay una manera más fácil, aunque no es tan fácil como la capacidad de expansión global de Unix / Linux:
app.exe $(ls *.txt | % {$_.FullName})
Explicación:
ls *.txt
obtiene objetos FileInfo de todos los archivos que coinciden con el glob*.txt
% { $_.FileName }
hace eso por nosotros%
recorre todos los elementos devueltos porls
cada nombre de archivo de los objetos.fuente
start notepad++ *.txt
(con intención de abrir todos los archivos de texto - el bloc de notas usado ++, ya que hace manejar varios nombres) se llevará a ninguna partedir *.txt | % { notepad++.exe $_ }
. Lo intenté con el bloc de notas simple, porque no tengo notepad ++, y funcionó. El comando recibe una lista de todos los archivos txt en el directorio actual, pasa la lista al siguiente comando que recorre la lista y ejecuta notepad ++ con el nombre de archivo como parámetro.grep "a b c"
en encontrar cualquiera de las cadenas enumeradas, donde "ab c" se expandiría en la listacopy a+b+c result
ycopy a result
copy b result
copy c result
. (y grep como utilidad existe en PS, se llamaselect-string
)Esto le dará una lista y también la colocará en una variable llamada
expanded_list
. Póngalo en un archivo por lotes y ejecute conmyBatchFile name myPattern
. Encierre el patrón con comillas si incluye espacios. Coincide con archivos, sin directorios. Ejecutar sin parámetros coincide con todos.Luego puede ejecutar su comando con
my_command_exec %expanded_list%
¡ADVERTENCIA! El tamaño máximo de la variable cmd es de 8191 caracteres (XP en adelante), por lo que es posible desbordarlo. No puede contar con la utilidad que siempre le dará una lista completa. Por otro lado, la longitud máxima de la línea cmd también es 8191, por lo que no podrá ejecutarla de todos modos.
fuente
Esto funciona en cmd.exe
o
fuente
dir /b TortoiseSVN\bin\sv*.exe
mostrarásvn.exe
ysvnadmin.exe
. Perodir /b TortoiseSVN\bi*\svn.exe
muestra un error de sintaxis.dir /s /b
. Esto te da el camino completo.Tenga en cuenta que esto está en Comentario a los carteles en un hilo separado user619818 y styfle)
DIR puede y permite buscar en todos los subdirectorios archivos que coincidan con un tipo específico.
Nota: Se asume que el directorio raíz para verificar en qué se encuentran todos los subdirectorios es "C: \ Mi programa \ Root \" ya que el autor no proporcionó un nombre de ruta bajo el cual se encuentran estos directorios
esto le dará las rutas completas de los archivos y los nombres de los archivos fuente.
si solo desea nombres de archivos, tendría que hacer lo siguiente
así que suponiendo que desea mover todos estos archivos de "C: \ Mi programa \ Root \ Sub Directorios \ *. ext" a "D: \ Singlefolder \ *. ext" simplemente haga esto:
Espero que ayude a otros en el futuro. :)
fuente
Esto es antiguo, pero con el subsistema Linux para Windows, es bastante común tener bash en tu RUTA ahora. Si ese es el caso, entonces este podría ser el truco para usted:
fuente