A opção dir/tw do DOS não funciona
-
29-10-2019 - |
Pergunta
Estou tentando comparar uma lista de arquivos com um arquivo de controle no carimbo de data/hora modificado usando
dir /b /tw /od controlfile olderfile | more +1
isso deve retornar o controlfile
como a data modificada em olderfile
é mais cedo do que controlfile
.No entanto, parece estar comparando a data de criação (olderfile
a data de criação é posterior controlfile
's) e assim sempre retornará olderfile
.O /tw
interruptor deve dizer dir
para usar a última data escrita (de dir /?
) então não tenho certeza do que estou fazendo de errado se quiser que /tw funcione conforme documentado?
:ATUALIZAR:
Até agora eu tive olderfile
em uma subpasta relativa a controlfile
.Quando eu copiei olderfile
para o mesmo diretório que controlfile
a comparação funcionou conforme o esperado - ou seja,o comando acima retornou controlfile
.Portanto, estar em uma subpasta obviamente quebra a comparação (mesmo quando a data de modificação da subpasta é semelhante à de olderfile
é em si anterior ao de controlfile
).
Então, minha pergunta agora é como solucionar isso, visto que a estrutura de diretórios é necessária?
Solução
Primeiro, uma explicação de por que seu código está falhando.
Olhando para DIR sem a opção /B, ele sempre exibe o caminho do arquivo como uma linha de cabeçalho, nunca junto com o nome do arquivo.Ao usar a opção de classificação junto com 2 especificações de arquivo no mesmo diretório, o comando é capaz de classificar os arquivos e exibi-los no mesmo cabeçalho de diretório.Mesmo que o nome do arquivo seja repetido, você sabe exatamente a qual arquivo o cabeçalho está se referindo.
Mas se as duas especificações do arquivo estiverem em caminhos diferentes, há uma chance de que o nome do arquivo seja o mesmo e apenas os caminhos sejam diferentes.Neste caso, a classificação não funciona, a menos que cada especificação de arquivo seja classificada em seu próprio cabeçalho;caso contrário, você não saberia qual arquivo era qual.Não faz muito sentido classificar um único arquivo, mas lembre-se de que a especificação do arquivo pode incluir curingas, por isso faz sentido.Portanto, sempre que a opção de classificação for combinada com várias especificações de arquivo usando caminhos diferentes, o DIR fará uma classificação separada para cada caminho, cada um com seu próprio cabeçalho.
Adicionar a opção /B remove os cabeçalhos do caminho, mas não altera o comportamento da classificação!Absolutamente um design bobo e inútil, mas é isso que você obtém.
Chegar a uma solução é muito mais problemático, especialmente se você quiser usar lote puro apenas com comandos nativos do Windows.Trabalhar com datas pode ser irritante em lote.
A solução em lote mais conveniente que posso encontrar é copiar temporariamente o segundo arquivo no diretório pai, executar sua comparação no diretório pai e, em seguida, excluir a cópia temporária.Mas isso pode ser um problema se o arquivo for grande.Ele também assume que o nome do arquivo ainda não existe no diretório pai.Se existir (ou existir), você poderá copiar o arquivo para um nome diferente, conhecido por ser exclusivo.É claro que você teria que traduzir o resultado.
Pelo que sei, qualquer outra solução em lote exigirá a análise de data e hora.Isso abre uma lata inteira de vermes.(É factível)
Se a sugestão COPY não for aceitável (eu não culparia você se você decidir não usá-la), recomendo usar algo diferente de lote, talvez VBScript, Javascript ou Powershell.Ou talvez uma abordagem híbrida como lote com algum VBScript incluído.