Questão Equivalente do Windows do comando do Linux 'touch'?


O que você usa quando deseja atualizar o campo de data de modificação de um arquivo no Windows?

  1. comandos acessível via C ++, .NET, C # ou algo nativo para o Windows (Vista preferencialmente)
  2. ferramentas / aplicações de preferência livre e, se possível, fonte aberta também

Editar:  já existe uma página para aplicativos como apontado por CheapScotsman Aqui.

Se alguém souber como posso fazer isso via C ++, C #, WSH ou algo similar, bom e bom, senão eu acho que todo o resto é coberto na questão ligada.


151


origem


As quatro alternativas mencionadas acima, mais outras quatro não mencionadas aqui, podem ser encontradas na resposta a uma pergunta semelhante: "Comando de Toque Recursivo do Windows" - JdeBP
stackoverflow.com/questions/210201/…    menciona uma carga, incluindo REM.>a - barlop


Respostas:


Se você quiser tocar o carimbo de data de um arquivo usando o windows, use o seguinte comando no prompt de comando:

copy /b filename.ext +,,

(Onde filename.ext é o nome do seu arquivo). o +,, é uma bandeira especial para copy dizendo para simplesmente atualizar a data / hora no arquivo:

* Alterar a hora e a data de um arquivo

Se você quiser atribuir a hora e a data atuais a um arquivo sem modificar o arquivo, use a seguinte sintaxe:

copy /b Source+,,

As vírgulas indicam a omissão do parâmetro Destination.

Edite com base nos comentários de Lumi e Justin: Coloque isso em um arquivo de lote, por exemplo. touch.cmd

@COPY /B %1+,, %1

Isso funciona mesmo se o arquivo não estiver no diretório atual (testado no Windows 7).


333



O que isso está fazendo? Onde está documentado? (O Google não indexa "+ ,," e o site da Microsoft não está me guiando na direção certa, já que pesquisar em "copiar" não ajuda muito.) Quero dizer, funciona muito bem e aproveito isso. muito por certo, mas estou curioso. - dash-tom-bang
Documentação para copy: technet.microsoft.com/en-us/library/bb490886.aspx - Joseph Hansen
type touch.bat é @echo off e próxima linha copy /b %1 +,, - Coloque dentro C:\bin ou o que você tem para seus próprios scripts, e então você pode usá-lo como touch myfile.txt. - Lumi
No Win7 isso não funcionará se você não estiver na pasta que contém o arquivo. Ele criará uma cópia no diretório de trabalho atual.
Se você precisar fazer isso em uma pasta remota (caminho UNC) - você deve especificar o destino para o comando de cópia também - copy /b Source+,, Source - Onde Source inclui o caminho completo para o arquivo - Justin


Eu usei e recomendo unxutils que são portas nativas do Win32 de muitos utilitários comuns do Unix. Existe um touch comando lá dentro.


160



Como quase todas as portas unix-para-windows, isso não funciona com caracteres unicode nos nomes de arquivos fora do conjunto de codificação como o padrão para programas não-unicode. Teste o nome do arquivo que irá atrapalhar todas as ferramentas: "test тест τεστ.txt" - RomanSt
gnuwin32 tem isso. mas na verdade, o gnuwin32 também falha em caracteres unicode. - barlop
Atualização de 2017 No Windows 10, podemos usar o subsistema Linux para windows, que instala o bash. Não há necessidade de cygwin, MinGW, unxutils ou qualquer outro unix parcial para as portas do Windows. docs.microsoft.com/pt-br/windows/wsl/install-win10 - Davos


Se tudo que você quer é mudar a data da última modificação do arquivo (que foi o meu caso):

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date

90



PowerShell FTW. Quero dizer, sério, o unix é legal, mas o PS é mais legal. - matt
Você pode atualizar a última vez que escrever para vários arquivos / pastas, bem
Isso funcionará apenas em um arquivo. Para vários arquivos: ls * | ForEach-Object {$ _. LastWriteTime = Get-Date} - Eli Algranti
Se você quiser fazer isso de forma recursiva, isso funciona muito bem: gci -recu -inc "."|% {$ _. LastWriteTime = Get-Date} - BrainSlugs83
@ BrainSlugs83: use backticks `para o código: gci -recu -inc "*.*" | % { $_.LastWriteTime = Get-Date } - alldayremix


type nul >>file & copy file +,,
  • Cria file se não existir.
  • Deixa o conteúdo do arquivo sozinho.
  • Apenas usa cmd built-ins.
  • Ambos último acesso e criação vezes atualizado.

ATUALIZAR

Gah! Isso não funciona em arquivos somente leitura, enquanto touch faz. Eu sugiro:

:touch
if not exist "%~1" type nul >>"%~1"& goto :eof
set _ATTRIBUTES=%~a1
if "%~a1"=="%_ATTRIBUTES:r=%" (copy "%~1"+,,) else attrib -r "%~1" & copy "%~1"+,, & attrib +r "%~1"

51



É uma pena que a cópia não possa ignorar o atributo + r da maneira que xcopy faz. Ou é uma pena que xcopy não suporte o estranho filename +,, sintaxe. - Abel
Infelizmente isso não funciona (pelo menos não no Windows 7). Parece que o interpretador de comandos não atualiza o registro de data e hora do destino de um redirecionamento se o arquivo não for realmente modificado (ou seja, não há dados para redirecionar). - Synetech


@ dash-tom-bang:

Aqui está a explicação de Technet sobre o misterioso '+' e vírgulas:

cópia / b Source + ,,

As vírgulas indicam a omissão de   o parâmetro Destination.

O comando copy suporta a mesclagem de vários arquivos em um único arquivo de destino. Como um destino em branco não pode ser especificado usando um caractere de espaço no prompt de comando, duas vírgulas podem ser usadas para denotar isso.

E esta é a referência do comando copy da Technet: http://technet.microsoft.com/pt-br/library/bb490886.aspx


32



Agora isso é apenas uma sintaxe confusa. A sério, O que eles estavam pensando? Observe também que a mesma documentação diz "Destino: Obrigatório". ... Estou surpreso. - sth
Isso parece nem funcionar no Vista ... Eu me pergunto se eles voltaram a si? - quillbreaker
Funciona no Windows 7 - Imran
Funcionou para mim mesmo sem vírgulas: copy file.ext + Portanto, a documentação está tão distante do comportamento real quanto o comportamento é de qualquer expectativa razoável. - Abgan
Funcionou no Windows Server 2008, mas apenas se você estiver na pasta que contém o arquivo - FrinkTheBrave


Se você quiser codificar você mesmo, o .NET oferece File.SetLastAccessTime, File.SetCreationTime e File.SetLastWriteTime métodos.


22





aqui está uma versão recursiva usando o powershell ... isso irá mudar a hora da última modificação para todos os arquivos e subdiretórios, e arquivos dentro dos subdiretórios deste diretório

ps c:myDir> Get-ChildItem . * -recurse | ForEach-Object{$_.LastWriteTime = get-date}

21



Menos detalhado, mas ainda usando apenas shorthands padrão do Powershell: ls * -recurse | % { $_.LastWriteTime = Get-Date } - Jonas