Ocasionalmente, a incapacidade do shell do cmd em expandir caminhos curinga pode realmente ser um inconveniente. Eu tive que passar 100 arquivos em um diretório para um programa e não consegui digitar * .ext. Em vez disso, usei 'ls' de mingw para despejar a lista em um arquivo e substituí novas linhas por espaços, copiadas e coladas no cmd. Um pesadelo.
Suspeito que a resposta seja não, mas alguém já lidou com isso ou apresentou alguma maneira de facilitar isso?
windows-7
command-line
wildcards
batch
cemitar
fonte
fonte
I suspect the answer will be no, but has anyone dealt with this or come up with any way to make this easier?
Na verdade, estou tendo o problema oposto, estou tentando descobrir uma maneira de fazer com que o interpretador de comandos trate sua lista como seqüências de caracteres e impeça que ela os represente como curingas. Por exemplo,for %i in (foobar baz really?) do @echo %i
irá tratar o último item (really?
) como um curinga nome do arquivo, e ignorá-lo se não há arquivos chamadosreally1
,reallyz
etc. ☹?
não é um caractere legal para nomes de arquivos no sistema de arquivos do Windows. O personagem só pode ser interpretado como um curinga. Consulte Nomeando arquivos, caminhos e espaços para nome no MSDN e Usando caracteres curinga no TechNet.Respostas:
O DOS e, consequentemente, o Windows '
cmd.exe
nunca suportaram expansão de curinga pelo shell. Estava sempre à disposição do aplicativo fazer a expansão.Isso significa que você sempre terá que encontrar outra rota se estiver usando um aplicativo que não suporta expansão. Você poderia:
dir /b > list.txt
para usar odir
comando para executar a expansão e colocar a lista de arquivos em um arquivo de texto (você poderá usar algo como uma fórmula do Excel se estiver realmente desesperado para produzir uma lista de comandos para colarcmd
ou usar o Excel para transpor as células para que todos os nomes de arquivos estejam na mesma linha.)fonte
Basta usar o Powershell, pré-instalado no Windows 7. O Powershell é capaz de executar comandos cmd e entende curingas em qualquer lugar do caminho.
Para iniciar o Powershell, digite "powershell" na caixa de pesquisa do menu Iniciar e pressione Enter.
Caso o aplicativo espere uma string com todos os nomes de arquivos, este é o script correto:
Mude
$delimiter = " "
para$delimiter = ","
se o seu aplicativo espera uma lista separada por vírgula de nomes de arquivos.Explicação do código:
[string]$files = $nothing
- cria uma variável vazia do tipostring
;
- é um separador para vários comandos, não um pipeline!ls *.txt | % { $files += $_.fullname + $delimiter }
- obtém uma lista de todos os arquivos de texto e cria uma string com todos os nomes de arquivos separados pelo delimitadorapplication.exe $files
- chama o aplicativo e passa a lista de arquivos para eleVocê pode até procurar um padrão de arquivo recursivamente adicionando
-recurse
parals *.txt
que o código completo fique assim:Edit:
Para evitar irritações,
ls
edir
são os pseudônimos deGet-ChildItem
e%
é um pseudônimo paraForEach-Object
. Eu mantenho meu código com aliases usados porque é mais curto.EDIT 2018/04/25:
Em 2012, sou relativamente novo no PowerShell. É claro que existe uma maneira mais fácil, embora não seja tão fácil quanto a capacidade de expansão glob do unix / linux:
app.exe $(ls *.txt | % {$_.FullName})
Explicação:
ls *.txt
obtém objetos FileInfo de todos os arquivos que correspondem ao glob*.txt
% { $_.FileName }
faz isso por nós.%
faz um loop em todos os elementos retornadosls
e gera cada objeto FileName.fonte
start notepad++ *.txt
(com intenção de abrir todos os arquivos de texto - bloco de notas usado ++ como ele faz lidar com vários nomes) levarão a lugar nenhumdir *.txt | % { notepad++.exe $_ }
. Eu tentei isso com o bloco de notas simples, porque não tenho o bloco de notas ++ e funcionou. O comando recebe uma lista de todos os arquivos txt no diretório atual, passa a lista para o próximo comando que percorre a lista e executa o bloco de notas ++ com o nome do arquivo como parâmetro.grep "a b c"
encontrar qualquer das cordas listados, onde "ab c" seria lista expandidacopy a+b+c result
ecopy a result
copy b result
copy c result
. (e grep como a utilidade fazer existe no PS, ele é chamadoselect-string
)Isso fornecerá uma lista e também a colocará na variável nomeada
expanded_list
. Coloque-o no arquivo em lotes e execute-o commyBatchFile name myPattern
. Coloque o padrão entre aspas se incluir espaços. Corresponde a arquivos, sem diretórios. Executar sem parâmetros corresponde a todos.Você pode então executar seu comando com
my_command_exec %expanded_list%
ATENÇÃO! O tamanho máximo da variável cmd é de 8191 caracteres (XP em diante), portanto, é possível transbordar! Você não pode contar com o utilitário para sempre fornecer uma lista completa. Por outro lado, o comprimento máximo da linha cmd também é 8191, portanto você não seria capaz de executá-lo de qualquer maneira.
fonte
Isso funciona no cmd.exe
ou
fonte
dir /b TortoiseSVN\bin\sv*.exe
, mostrarásvn.exe
esvnadmin.exe
. Masdir /b TortoiseSVN\bi*\svn.exe
mostra um erro de sintaxe.dir /s /b
. Isso fornece o caminho completo.Observe que isso está em Comentário aos pôsteres em um thread separado user619818 e styfle)
O DIR pode e permite procurar em todos os subdiretórios arquivos que correspondam a um tipo específico.
Nota: O diretório raiz para verificar em que todos os subdiretórios estão é considerado "C: \ My Program \ Root \", pois o autor não forneceu um nome de caminho no qual esses diretórios estão localizados
isso fornecerá os caminhos e os nomes completos dos arquivos de origem.
se você quiser apenas nomes de arquivos, deverá fazer o seguinte
supondo que você queira mover todos esses arquivos de "C: \ Meu programa \ Raiz \ Subdiretórios \ *. ext" para "D: \ Pasta única \ *. ext", basta fazer o seguinte:
Espero que ajude outras pessoas no futuro. :)
fonte
Isso é antigo, mas com o subsistema Linux para Windows, é bastante comum ter o bash no seu PATH agora. Se for esse o caso, isso pode fazer o truque para você:
fonte