Pergunta

Eu tenho um conjunto de base de nomes de arquivos, para cada nome de 'f', existem exatamente dois arquivos, 'f'.em' e 'f'.fora de casa".Eu quero escrever um arquivo em lotes (no Windows XP) que passa através de todos os nomes, para que cada um deve:

  • Exibir o nome de base do 'f'
  • Executar uma ação em 'f'.em'
  • Executar outra ação, no 'f'.fora'

Eu não tenho nenhuma maneira de listar o conjunto de base de nomes de arquivos diferente para pesquisar *.(ou *.out), por exemplo.

Foi útil?

Solução

Supondo que você tenha dois programas que processam os dois arquivos, process_in.exe e process_out.exe:

for %%f in (*.in) do (
    echo %%~nf
    process_in "%%~nf.in"
    process_out "%%~nf.out"
)

%%~nf é a substituição de modificador, que se expande %f para apenas um nome de ficheiro.Veja outros modificadores em https://technet.microsoft.com/en-us/library/bb490909.aspx (midway em baixo da página) ou apenas na próxima resposta.

Outras dicas

Você pode usar essa linha para imprimir o conteúdo da sua área de trabalho:

FOR %%I in (C:\windows\desktop\*.*) DO echo %%I 

Uma vez que você tem o %%I variável é fácil, para executar um comando sobre ele (basta substituir a palavra eco com seu programa)

Além disso, a substituição de variável referências tem sido reforçada Agora você pode usar a seguinte sintaxe opcional:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only (directory with \)
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string


[https://ss64.com/nt/syntax-args.html][1]

Nos exemplos acima %I e o CAMINHO pode ser substituído por outro documento de valores.O %~ a sintaxe é terminada por um nome DE variável for válido.Escolhendo nomes de variáveis maiúsculas como %I se torna mais legível e evita a confusão com os modificadores, que não são sensíveis a maiúsculas e minúsculas.

Você pode obter toda a documentação digitando FOR /?

De forma mais fácil, como eu o vejo, é usar um loop for que chama um segundo arquivo de lote para processamento, de passagem, que segundo arquivo, o nome de base.

De acordo com o /?ajuda, basename pode ser extraído utilizando o bacana ~n opção.Assim, a base de script ficaria:

for %%f in (*.in) do call process.cmd %%~nf

Em seguida, no processo.cmd, suponha que %0 contém o nome de base e agir de acordo.Por exemplo:

echo The file is %0
copy %0.in %0.out
ren %0.out monkeys_are_cool.txt

Pode haver uma maneira melhor para fazer isto em um script, mas eu sempre fui um pouco vago sobre como puxar de vários comandos em um único loop for em um arquivo em lotes.

EDITAR:Isso é fantástico!Eu tinha de alguma forma perdeu a página do docs que mostra que você poderia fazer multi-linha de blocos em um loop FOR.Eu estou indo para ir ter que voltar e reescrever alguns arquivos em lote agora...

Não é uma ferramenta normalmente utilizada em Servidores MS (tanto quanto me lembro) chamado forfiles:

O link acima contém ajuda, assim como um link para microsoft (a página de download.

Expansão Nathans o post.A seguir vai fazer o trabalho muito em um arquivo em lotes.

@echo off

if %1.==Sub. goto %2

for %%f in (*.in) do call %0 Sub action %%~nf
goto end

:action
echo The file is %3
copy %3.in %3.out
ren %3.out monkeys_are_cool.txt

:end

O código abaixo filtros de nomes de arquivos começando com a, dada substring.Ele pode ser alterado para se adequar a diferentes necessidades, trabalhando em subfname subseqüência de extração e instrução IF:

echo off
rem filter all files not starting with the prefix 'dat'
setlocal enabledelayedexpansion
FOR /R your-folder-fullpath %%F IN (*.*) DO (
set fname=%%~nF
set subfname=!fname:~0,3!
IF NOT "!subfname!" == "dat" echo "%%F"
)
pause

Ecoando f.e f.irá separar o conceito do que é para repetir e o que não para repetir quando usado em um de /f loop.

::Get the files seperated
echo f.in>files_to_pass_through.txt
echo f.out>>files_to_pass_through.txt

for /F %%a in (files_to_pass_through.txt) do (
for /R %%b in (*.*) do (
if "%%a" NEQ "%%b" (
echo %%b>>dont_pass_through_these.txt
)
)
)
::I'm assuming the base name is the whole string "f".
::If I'm right then all the files begin with "f".
::So all you have to do is display "f". right?
::But that would be too easy.
::Let's do this the right way.
for /f %%C in (dont_pass_through_these.txt)
::displays the filename and not the extention
echo %~nC
)

Apesar de você não pergunte, uma boa maneira de passar comandos para f.e f.fora seria...

for /F %%D "tokens=*" in (dont_pass_through_these.txt) do (
for /F %%E in (%%D) do (
start /wait %%E
)
)

Um link para todos os comandos do Windows:link

Peço desculpas se eu não responder isso corretamente.A questão foi muito difícil para mim ler.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top