Eu tenho um conjunto de nomes de arquivos base, para cada nome 'f' existem exatamente dois arquivos, 'f.in' e 'f.out'. Quero escrever um arquivo em lotes (no Windows XP) que revise todos os nomes de arquivos, para cada um deles:
- Exiba o nome base 'f'
- Execute uma ação em 'f.in'
- Execute outra ação em 'f.out'
Não tenho como listar o conjunto de nomes de arquivos base, além de procurar * .in (ou * .out), por exemplo.
command-line
windows-xp
batch-file
Luke Halliwell
fonte
fonte
Respostas:
Supondo que você tenha dois programas que processam os dois arquivos, process_in.exe e process_out.exe:
%% ~ nf é um modificador de substituição que expande% f apenas para um nome de arquivo. Veja outros modificadores em https://technet.microsoft.com/en-us/library/bb490909.aspx (no meio da página) ou apenas na próxima resposta.
fonte
%%f
por que é mais%%~nf
tarde?~
modificadores para fazer as coisas, como no meu exemplo, basta obter o nome do arquivo. É apenas um hábito para mim usar isso no caso de*
fazer o caminho completo ou algo assim. Existem alguns desses modificadores (no meio da página): microsoft.com/resources/documentation/windows/xp/all/proddocs/…Você pode usar esta linha para imprimir o conteúdo da sua área de trabalho:
Depois de ter a
%%I
variável, é fácil executar um comando nela (basta substituir a palavra eco pelo seu programa)Além disso, a substituição das referências de variáveis FOR foi aprimorada. Agora você pode usar a seguinte sintaxe opcional:
https://ss64.com/nt/syntax-args.html
Nos exemplos acima,
%I
PATH pode ser substituído por outros valores válidos. A%~
sintaxe é finalizada por um nome de variável FOR válido. Escolher nomes de variáveis em maiúsculas como o%I
torna mais legível e evita confusão com os modificadores, que não diferenciam maiúsculas de minúsculas.Você pode obter a documentação completa digitando
FOR /?
fonte
%%I was unexpected at this time.
%I
, em vez de%%I
A maneira mais fácil, a meu ver, é usar um loop for que chame um segundo arquivo em lotes para processamento, passando para o segundo arquivo o nome base.
De acordo com o / /? ajuda, o nome da base pode ser extraído usando a opção nifty ~ n. Portanto, o script base seria:
Em process.cmd, suponha que% 0 contenha o nome da base e aja de acordo. Por exemplo:
Pode haver uma maneira melhor de fazer isso em um script, mas sempre fiquei um pouco confuso sobre como puxar vários comandos em um único loop for em um arquivo em lotes.
EDIT: Isso é fantástico! De alguma forma, havia perdido a página nos documentos que mostravam que era possível fazer blocos de várias linhas em um loop FOR. Vou precisar voltar e reescrever alguns arquivos em lotes agora ...
fonte
Expandindo no post de Nathans . A seguir, o lote será executado em um arquivo em lotes.
fonte
Existe uma ferramenta geralmente usada nos servidores MS (pelo que me lembro) chamada forfiles :
O link acima contém ajuda e também um link para a página de download da microsoft.
fonte
O código abaixo filtra os nomes de arquivos iniciados com a subsequente substring. Ele pode ser alterado para atender a diferentes necessidades, trabalhando na extração de substring de sub-nome e na instrução IF:
fonte
O eco de f.in e f.out separará o conceito do que fazer loop e do que não fazer loop quando usado em um loop for / f.
Embora você não tenha perguntado, uma boa maneira de passar comandos para f.in e f.out seria ...
Um link para todos os comandos do Windows XP: link
Peço desculpas se não respondi corretamente. A pergunta foi muito difícil para mim ler.
fonte