it-swarm.dev

Equivalente Windows do comando Linux 'toque'?

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

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

Edit: já existe uma página para aplicativos como apontado por CheapScotsman aqui .

Se alguém sabe como eu posso fazer isso via C++, C #, WSH ou algo semelhante, bem e bem, senão eu acho que todo o resto é coberto na questão vinculada.

167
facepalmd

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 +,, é um sinalizador especial para copy dizendo para simplesmente atualizar a data/hora no arquivo :

* Alterando 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).

348
Gish Domains

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

160
Greg Hewgill

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
95
ThiagoAlves
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 times atualizados.

UPDATE

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"
58
bobbogo

@ dash-tom-bang:

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

cópia/b Source + ,

As vírgulas indicam a omissão do 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 de comando copy da Technet: http://technet.Microsoft.com/en-us/library/bb490886.aspx

32
Faredoon

Se você quiser codificá-lo, o .NET oferece os códigos File.SetLastAccessTime , File.SetCreationTime e File.SetLastWriteTime .

23
Fredrik Mörk

aqui está uma versão recursiva usando o powershell ... isso irá mudar o horário 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
roger

O projeto GnuWin32 possui portas Windows das versões Gnu dos utilitários de linha de comando Unix.

Ele vem como um número de pacotes separados e você pode instalar apenas os comandos que você precisa sem outras dependências. Para touch, você precisaria do pacote CoreUtils .

15
Dave Webb

Eu tentei isso para criar um arquivo vazio no meu script em lotes. Você pode usar isto:

ECHO text>file1.txt
15
pkm

cygwin vem com touch. Eu sei que você mencionou que não quer instalar um framework inteiro, mas o cygwin é bem leve, e pode ser chamado a partir da janela de comando do DOS sem que toda a linha de comando parecida com o unix seja ativada.

Você também pode controlar quais ferramentas instalar, portanto, basta instalar o arquivo touch.exe e deixar o resto da estrutura.

14
serg10

Aqui está um arquivo de reg simples que eu escrevi para adicionar o botão direito do mouse "toque" no Windows Explorer . Seria fácil fazer o roteiro também, já que apenas chama:

cmd.exe /c copy %1+nul %1 /by
14
Jon Galloway

Portas win32 nativas de muitos comandos unix , incluindo toque.

Eu usei isso antes e funciona bem - sem instalação, sem DLLs, etc

12
Adam Davis

Tente este de CodeProject .

  • Não há necessidade de instalar.
  • Se você quiser, você pode até modificar a fonte.
11
Prakash

Você também pode instalar o Cygwin que lhe dá o Touch, bem como uma infinidade de outros comandos * do NIX.

9
jamesaharvey

De um pergunta semelhante no Stack Overflow.

Para atualizar os timestamps (ignorando a outra funcionalidade de touch), eu usaria:

copy /b filename.ext +,,
5
Dennis Williamson

Existem portas Windows de muitos utilitários Unix. Dê uma olhada em unxutils ou GnuWin32 projects.

5
VladV

a partir do site:

Funduc Software Touch é um utilitário gratuito 'touch' que permite alterar a hora/data e/ou selos de atributos em um ou mais arquivos. Além disso, FS O toque pode adicionar/subtrair um número especificado de segundos do tempo de arquivo existente. Você pode especificar quais arquivos e/ou subdiretórios serão alterados por meio de 'máscaras de arquivo complexas'. O programa pode ser executado interativamente ou pela linha de comando. A novidade para a versão 7.2 é uma opção de linha de comando para alterar o registro de data e hora do arquivo modificado +/- o número especificado de segundos.

O FS Touch é executado no Windows XP, Vista, Windows 7 e Windows 8.

4
Marek

Este conteúdo pode ser salvo em um arquivo reg. Isso adicionará um menu de contexto do botão direito para todos os arquivos com a habilidade "Touch File" (testada no Windows 7). Copie all as seguintes linhas para o arquivo reg. Execute o arquivo e aprove a questão. Clique com o botão direito do mouse em qualquer arquivo (ou vários arquivos) - a opção "Touch File" já está disponível.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\Shell]

[HKEY_CLASSES_ROOT\*\Shell\Touch File]

[HKEY_CLASSES_ROOT\*\Shell\Touch File\command]
@="cmd /C copy /b \"%1\" +,,"
4
SharonBL
4
CheapScotsman

Se você estiver usando git para um ou mais projetos, o git-bash baseado em mingw para Windows possui o comando touch. Quero agradecer a @ greg-hewgill por me apontar que 'nix existem utilitários para windows, porque foi isso que me colocou na ideia de tentar tocar em git-bash.

3
Superole

no PowerShell, tente:

ni fileName.txt

NI é um alias do cmdlet New-Item .

3
Monfa.red

Eu encontrei uma maneira rápida de fazer isso se você tiver instalado vim (não ótimo para arquivos grandes, vai abrir o arquivo inteiro, em seguida, fechá-lo ...)

vim foobar.txt +wq!

O "+" define argumento para executar os seguintes comandos. "wq!" é "escrever, sair, forçar". Isto irá abrir o arquivo, salvar, e depois fechá-lo imediatamente depois.

2
Jason

Salve o seguinte como touch.bat na sua pasta% windir%\system32 ou adicione a pasta na qual ele está salvo em sua variável de ambiente PATH:

@echo off
if %1.==. goto end
if not exist %1 goto end
copy /b %1 +,, > nul
echo %1 touched!
:end

Uso da amostra:

touch *.cpp
touch somefile.c

Referência: Microsoft KB 69581

2
Tim Partridge

Eu queria o recurso 'touch' de clonar/duplicar as datas do arquivo de outro arquivo, nativamente, e ser utilizável de um arquivo em lotes.

Então 'arraste e solte' o arquivo de vídeo para o arquivo de lote, o FFMPEG é executado, então 'Date Created' e 'Date Modified' do arquivo de entrada são copiados para o arquivo de saída.

Isso pareceu simples no começo até você achar que os arquivos em lote são terríveis para lidar com nomes de arquivos unicode, o PowerShell in-line bagunça com símbolos de nomes de arquivos, eo duplo escape deles é um pesadelo.

Minha solução foi tornar a parte 'touch' um script separado do PowerShell que eu chamei de 'CLONE-FILE-DATE.ps1' e contém:

param
(
  [Parameter(Mandatory=$true)][string]$SourcePath,
  [Parameter(Mandatory=$true)][string]$TargetPath
)

(GI -LiteralPath $TargetPath).CreationTime  = (GI -LiteralPath $SourcePath).CreationTime
(GI -LiteralPath $TargetPath).LastWriteTime = (GI -LiteralPath $SourcePath).LastWriteTime

Então aqui está o uso de exemplo dentro do meu arquivo batch 'CONVERT.BAT':

%~dp0\ffmpeg -i "%~1" ACTION "%~1-output.mp4"

CHCP 65001 > nul && PowerShell -ExecutionPolicy ByPass -File "%~dp0\CLONE-FILE-DATE.PS1" "%~1" "%~1-output.mp4"

Eu acho que o PowerShell é legível, então só vai explicar o lote falar:

% ~ dp0 é o diretório atual do arquivo em lotes.

% ~ 1 é o caminho do arquivo solto no lote sem aspas.

CHCP 65001> nul define os caracteres para UTF-8 e engole a saída.

-ExecutionPolicy ByPass permite que você execute o PowerShell sem precisar modificar a política global, que está lá para evitar que as pessoas executem scripts acidentalmente.

1
WhoIsRich

Experimentar

arquivo fsutil createnew new.txt 0

1
Peter Hacke

As cinco alternativas mencionadas acima, mais outras três não mencionadas aqui, podem ser encontradas no SuperUser: "Windows Recursive Touch Command"

1
JdeBP

Isso é um pouco não relacionado à pergunta original, mas acho isso muito útil no Windows devido à GUI.

Eu estou usando o utilitário TouchPro que fornece umGUI(constrói no Explorer Shell):

http://www.jddesign.co.uk/products/touchpro/touchpro.htm

1
rustyx

Bem, se você realmente quiser ter o comando touch disponível, você pode colocar isso em um arquivo de lote chamado touch.bat e colocá-lo em C:\Windows:

TYPE NUL >>%1

Simples o suficiente.

1
MD XF

O pessoal do Unix resolveu o problema geral de atualizar a data do arquivo de qualquer arquivo com o comando touch . No entanto, para o Windows, às vezes, é possível um método mais simples para casos especiais.

Eu preciso atualizar o timestamp de um atalho de aplicativo no Windows 8.1, a fim de tornar as alterações na cor de fundo do Application Tile visíveis, veja this SO question . Em vez de implementar uma das ferramentas inteligentes acima, acho mais fácil editar o campo de comentário do atalho. A maioria das pessoas deixa isso vazio, mas é claro, um comentário útil é rapidamente concebido. E se houver um comentário, adicionar ou remover um período final nunca será prejudicado.

0
Roland

Eu aprecio isso é uma pergunta antiga, acabei de descobrir toque no meu sistema Windows 10. Eu baixei e instalei o Git de aqui (eu acho) e parece que o touch e vários outros utilitários estão na pasta bin.

0
0909EM