Questão Equivalente ao Linux `toque` para criar um arquivo vazio com o PowerShell? [duplicado]


Esta questão já tem uma resposta aqui:

No PowerShell existe um equivalente de touch?

Por exemplo, no Linux, posso criar um novo arquivo vazio invocando:

touch filename

No Windows isso é bem complicado - normalmente eu apenas abro uma nova instância do notepad e salvo um arquivo vazio.

Existe uma maneira programática no PowerShell de fazer isso?

Eu não estou olhando para combinar exatamente o comportamento do toque, mas apenas para encontrar o equivalente mais simples possível para a criação de arquivos vazios.


133


origem


Vejo Versão do Windows do comando Unix touch E Equivalente do Windows do comando do Linux 'touch'? - amiregelz
Obrigado. Eu olhei para eles, mas a maioria da resposta se concentra no prompt de comando. Eu gostaria de ter uma solução PowerShell que não requer que eu instale novos aplicativos. - jsalonen
Downvoted a questão - ambos os recursos são apenas mais algumas linhas de código, basta implementar ambos, não apenas metade, esp. quando o outro meio ausente é tão perigoso. - yzorg
@yzorg: O que você quer dizer com os dois recursos? Eu só estava perguntando como criar um arquivo vazio no PS da maneira que você pode fazer com touch no Linux. - jsalonen
@jsalonen Use * nix touch em um arquivo existente, ele atualizará o último horário de gravação sem modificar o arquivo, consulte os links de @amiregelz. Esta questão tem uma alta classificação no google para powershell touch, Eu queria alertar os copiadores / copiadores que apenas essa metade pode destruir dados, quando o * nix touch não. Veja @LittleBoyLost resposta que manipula quando o arquivo já existe. - yzorg


Respostas:


Usando o redirecionador de acréscimo ">>" resolve o problema em que um arquivo existente é excluído:

echo $null >> filename

138



Também conhecido como 'echo null> filename' em um prompt de comando, possivelmente um arquivo em lote. Legal para ver a versão do PowerShell, obrigado! - Mark Allen
toque é bastante diferente do que isso se o arquivo já existe - jk.
o eco é desnecessário $null > filename funciona bem. - alirobe
Isso grava 2 bytes de unicode BOM 0xFEFF para mim. - mlt
Nota importante: Muitas ferramentas unix não lidam com a BOM. Isso inclui git por exemplo (mesmo no windows). Você terá problemas se usar arquivos criados dessa maneira com ferramentas que não reconhecem BOMs. por exemplo. você tenta criar seu .gitignore usando este comando e me pergunto por que não vai funcionar. BOM é o motivo. - martixy


Aqui está uma versão que cria um novo arquivo se ele não existir ou atualiza o timestamp se ele existir.

Function Touch-File
{
    $file = $args[0]
    if($file -eq $null) {
        throw "No filename supplied"
    }

    if(Test-Path $file)
    {
        (Get-ChildItem $file).LastWriteTime = Get-Date
    }
    else
    {
        echo $null > $file
    }
}

73



Esta é a resposta correta para replicar o programa de toque Unix (embora com um nome diferente), mas a questão é orientada para simplesmente criar um novo arquivo. - Jamie Schembri
Muito, muito tiny quibble: Enquanto o Touch-File está em conformidade com a convenção de nomenclatura Verb-Noun do PS, Touch não é um verbo "aprovado" (não que seja um requisito significativo: msdn.microsoft.com/pt-br/library/ms714428.aspx). File está bem, btw. Eu recomendo os nomes Set-File ou Set-LastWriteTime ou meu favorito Update-File. Além disso, eu recomendaria Add-Content $file $null ao invés de echo $null > $file. Por fim, defina um alias com Set-Alias touch Update-File se você quiser continuar usando o comando touch - Alan McBee


Para criar um arquivo em branco:

New-Item -ItemType file example.txt

Para atualizar o registro de data e hora de um arquivo:

(gci example.txt).LastWriteTime = Get-Date

63



Eu acho que essa é a melhor abordagem! - Jayesh Bhoot
Isso funciona para atualizar o registro de data e hora de uma pasta? - riahc3
@ riahc3, use isto: (gi MyFolder).LastWriteTime = Get-Date . Você poderia usar isso para arquivos também. - dangph
Ainda mais enérgico: ni example.txt - Nick Cox
Este método não adiciona os terríveis bytes de BOM e a codificação parece felizmente ser UTF-8. - Davos


No PowerShell, você pode criar uma função semelhante do Touch como tal:

function touch {set-content -Path ($args[0]) -Value ($null)} 

Uso:

touch myfile.txt

Fonte


24



Isso é ótimo, obrigado! Apenas o que eu queria! Alguma idéia de como eu poderia instalar essa função no PowerShell para que ele seja carregado automaticamente quando eu iniciar o shell? - jsalonen
Adicione ao seu arquivo $ profile. (Execute o perfil do $ notepad para editar esse arquivo.) - Mark Allen
Isso excluirá o conteúdo do arquivo, se existir. - dangph


eu prefiro

fc > filename

para esta tarefa. Para trabalhar com arquivos não vazios, você pode usar

fc >> filename

fc é simplesmente um alias para Formato personalizado. Eu escolhi porque é um comando curto que não faz nada neste contexto, um noop. Também é bom porque se você esquecer o redirecionar

fc filename

em vez de lhe dar um erro, novamente ele não faz nada. Alguns outros aliases que vai funcionar são

ft -> Format-Table
fw -> Format-Wide

10





Reuni várias fontes e terminei com o seguinte, que atendia às minhas necessidades. Eu precisava definir a data de gravação de uma DLL que foi criada em uma máquina em um fuso horário diferente:

$update = get-date
Set-ItemProperty -Path $dllPath -Name LastWriteTime -Value $update

Claro, você também pode configurá-lo para vários arquivos:

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update

7



+1 para o modo mais poderoso de alterar LastWriteTime em um arquivo (que é o que eu precisava), embora a questão se concentrasse no novo recurso de criação de arquivo do comando touch. - Nathan Hartley
Sem usar uma variável? - riahc3


Há um monte de respostas dignas, mas eu gosto do apelido de New-Item, que é apenas: ni

Você também pode renunciar a declaração de tipo de arquivo (que eu assumo é implícito quando uma extensão é adicionada), então para criar um arquivo javascript com o nome de 'x' no meu diretório atual eu posso simplesmente escrever:

ni x.js

3 caracteres mais rápido do que toque!


6



Isso não é idempotente ni : The file 'x.js' already exists - Steven Penny


Abra o seu arquivo de perfil:

notepad $profile

Adicione a seguinte linha:

function touch {New-Item "$args" -ItemType File}

Salve e recarregue seu perfil $ para usá-lo imediatamente. (Não há necessidade de fechar e abrir o powershell)

. $profile

Para adicionar um novo arquivo no tipo de diretório atual:

touch testfile.txt

Para adicionar um novo arquivo dentro do diretório 'myfolder':

touch myfolder\testfile.txt

Se um arquivo com o mesmo nome já existir, ele não será substituído. Em vez disso, você receberá um erro.

Espero que ajude

Ponta do bônus:

Você pode fazer o equivalente a 'mkdir' adicionando a seguinte linha:

function mkdir {New-Item "$args" -ItemType Directory} 

O mesmo uso:

mkdir testfolder
mkdir testfolder\testsubfolder

4