Équivalent de Linux `touch` pour créer un fichier vide avec PowerShell? [dupliquer]

168

Cette question a déjà une réponse ici:

Dans PowerShell, existe-t-il un équivalent de touch?

Par exemple, sous Linux, je peux créer un nouveau fichier vide en appelant:

touch filename

Sous Windows, cela est assez délicat. Habituellement, je viens d'ouvrir une nouvelle instance de Notepad et de sauvegarder un fichier vide.

Existe-t-il donc une méthode de programmation dans PowerShell?

Je ne cherche pas à faire correspondre exactement le comportement des contacts, mais juste à trouver l'équivalent le plus simple possible pour créer des fichiers vides.

Jsalonen
la source
Merci. Je les ai regardées, mais la plupart des réponses se concentrent sur l'invite de commande. J'aimerais disposer d'une solution PowerShell qui ne nécessite pas l'installation de nouvelles applications.
Jsalonen
La question a été rejetée: les deux fonctionnalités ne sont que quelques lignes de code supplémentaires, mais implémentez-les toutes les deux, pas seulement la moitié, en particulier. quand la moitié manquante est si dangereuse.
Yzorg
@yzorg: Qu'entendez-vous par les deux fonctionnalités? Je demandais seulement comment créer un fichier vide sous PS comme vous pouvez le faire touchsous Linux.
Jsalonen
@jsalonen Utilisez * nix touchsur un fichier existant, il mettra à jour la dernière heure d'écriture sans modifier le fichier, voir les liens de @amiregelz. Cette question a un classement Google élevé pour powershell touch, je voulais alerter les copier / coller que seulement cette moitié peut détruire des données, quand * nix touch ne le fait pas. Voir @LittleBoyLost réponse qui gère lorsque le fichier existe déjà.
Yzorg

Réponses:

166

L'utilisation du redirecteur ">>" ajoute le problème de suppression d'un fichier existant:

echo $null >> filename
Yash Agarwal
la source
3
Également appelé «echo null> nomfichier» à partir d'une invite de commande, éventuellement un fichier de commandes. Cool de voir la version PowerShell, merci!
Mark Allen
16
touch est assez différent de cela si le fichier existe déjà
jk.
9
echo est inutile, $null > filenamefonctionne très bien.
Alirobe
8
Cela écrit 2 octets de nomenclature unicode 0xFEFF pour moi.
Mlt
4
Remarque importante: de nombreux outils Unix ne traitent pas les nomenclatures. Cela inclut git par exemple (même sous windows). Vous allez avoir des problèmes si vous utilisez des fichiers créés de cette manière avec des outils qui ne reconnaissent pas les nomenclatures. Par exemple, vous essayez de créer votre en .gitignoreutilisant cette commande et vous vous demandez pourquoi cela ne fonctionne pas. BOM est la raison.
martixy
96

Pour créer un fichier vide:

New-Item -ItemType file example.txt

Pour mettre à jour l'horodatage d'un fichier:

(gci example.txt).LastWriteTime = Get-Date
dangph
la source
4
Je pense que c'est la meilleure approche!
Jayesh Bhoot
Est-ce que cela fonctionne pour mettre à jour l'horodatage d'un dossier?
Riahc3
1
@ riahc3, utilisez ceci: (gi MyFolder).LastWriteTime = Get-Date. Vous pouvez aussi l'utiliser pour les fichiers.
dangph
9
Encore plus léger:ni example.txt
Nick Cox
2
Cette méthode n’ajoute pas les terribles octets de la nomenclature et le codage semble heureusement être UTF-8.
Davos
75

Voici une version qui crée un nouveau fichier s'il n'existe pas ou met à jour l'horodatage s'il existe.

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
    }
}
LittleBoyLost
la source
4
C’est la bonne réponse pour répliquer le programme tactile Unix (bien que sous un nom différent), mais la question est orientée vers la simple création d’un nouveau fichier.
Jamie Schembri
15
Très, très petit problème: Bien que Touch-File soit conforme à la convention de nommage Verb-Noun de PS, ce Touchn'est pas un verbe "approuvé" (ce n'est pas une exigence importante: msdn.microsoft.com/en-us/library/ms714428. aspx ). Fileest bien, d'ailleurs. Je recommande les noms Set-Fileou Set-LastWriteTimeou, mon préféré, Update-File. Aussi, je recommanderais Add-Content $file $nullau lieu de echo $null > $file. Enfin, définissez un alias avec Set-Alias touch Update-Filesi vous souhaitez continuer à utiliser la commandetouch
Alan McBee,
Suggérez-lui d’ajouter ceci à la dernière ligne:New-Alias -Name Touch Touch-File
stimpy77
25

Dans PowerShell, vous pouvez créer une fonction tactile similaire en tant que telle:

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

Usage:

touch myfile.txt

La source

Ƭᴇcʜιᴇ007
la source
C'est génial, merci! Juste ce que je voulais! Avez-vous des idées pour installer cette fonction dans PowerShell afin qu’elle se charge automatiquement lorsque je lance le shell?
Jsalonen
2
Ajoutez-le à votre fichier de profil $. (Exécutez notepad $ profile pour éditer ce fichier.)
Mark Allen
25
Cela supprimera le contenu du fichier s'il existe.
dangph
1
Ou la version sûre qui ne supprime pas le contenu du fichier existant function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } }
alastairtree
13

je préfère

fc > filename

pour cette tâche. Pour travailler avec des fichiers non vides, vous pouvez utiliser

fc >> filename

fcest simplement un alias pour Format-Custom . Je l'ai choisi parce que c'est une commande courte qui ne fait rien dans ce contexte, un noop . C'est aussi bien parce que si vous oubliez la redirection

fc filename

au lieu de vous donner une erreur, encore une fois, cela ne fait rien. Certains autres alias qui fonctionneront sont

ft -> Format-Table
fw -> Format-Wide
Steven Penny
la source
9

Il y a déjà un tas de réponses dignes, mais j'aime bien le pseudonyme de New-Item qui est juste: ni

Vous pouvez également renoncer à la déclaration de type de fichier (ce qui, je suppose, est implicite lorsqu'une extension est ajoutée). Par conséquent, pour créer un fichier javascript portant le nom "x" dans mon répertoire actuel, je peux simplement écrire:

ni x.js

3 caractères plus rapide que le toucher!

Jacob E. Dawson
la source
Ce n'est pas idempotentni : The file 'x.js' already exists
Steven Penny
8

J'ai mis en place diverses sources et les résultats suivants ont répondu à mes besoins. Je devais définir la date d'écriture d'une DLL créée sur une machine dans un fuseau horaire différent:

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

Bien sûr, vous pouvez également le configurer pour plusieurs fichiers:

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update
John Saunders
la source
1
+1 pour le moyen le plus optimiste de changer LastWriteTime sur un fichier (ce dont j'avais besoin), même si la question portait sur la nouvelle fonctionnalité de création de fichier de la commande tactile.
Nathan Hartley
Sans utiliser une variable?
Riahc3
6

Il semble qu'un tas de réponses ici ne tiennent pas compte du codage de fichier.

Je viens de rencontrer ce problème, pour diverses autres raisons, mais

echo $null > $file

$null > $file

les deux produisent un fichier UTF-16-LE, tandis que

New-Item $file -type file

produit un fichier UTF-8.

Pour une raison quelconque fc > $fileet fc >> $file, semblent également produire des fichiers UTF-8.

Out-File $file -encoding utf8

vous donne un fichier UTF-8-BOM, tandis que

Out-File $file -encoding ascii

vous donne un fichier UTF-8. Les autres encodages valides (mais non testés) pris en charge par Out-File sont les suivants: [[-Encoding] {unknown | chaîne | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | par défaut | oem}]. Vous pouvez également diriger des éléments vers Out-File pour donner au fichier des données de texte à stocker, ainsi qu'un indicateur -append. Par exemple:

echo $null | Out-File .\stuff.txt -Encoding ascii -Append

Cet exemple ne met pas à jour l'horodatage pour une raison quelconque, mais celle-ci le fait:

echo foo | Out-File .\stuff.txt -Encoding ascii -Append

Bien que cela ait l’effet secondaire d’ajouter "foo" à la fin du fichier.

Si vous n’êtes pas sûr de l’encodage que vous possédez, j’ai trouvé que VS-Code possède une fonction astucieuse dans laquelle, dans le coin inférieur droit, il est indiqué quel est l’encodage. Je pense que Notepad ++ a également une fonctionnalité similaire.

Garret Hoffman
la source
Set-Content -Path $file -value $nulleffectue le travail et n’affecte pas le codage du fichier. Vérifiez également la version ss64 detouch .
Anton Krouglov
5

Ouvrez votre fichier de profil:

notepad $profile

Ajoutez la ligne suivante:

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

Enregistrez-le et rechargez votre profil $ afin de pouvoir l'utiliser immédiatement. (Pas besoin de fermer et d'ouvrir PowerShell)

. $profile

Pour ajouter un nouveau fichier dans le type de répertoire actuel:

touch testfile.txt

Pour ajouter un nouveau fichier dans le type de répertoire 'myfolder':

touch myfolder\testfile.txt

Si un fichier portant le même nom existe déjà, il ne sera pas oublié. Au lieu de cela, vous obtiendrez une erreur.

J'espère que ça aide

Bonus:

Vous pouvez faire l'équivalent de 'mkdir' en ajoutant la ligne suivante:

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

Même utilisation:

mkdir testfolder
mkdir testfolder\testsubfolder
RafaelGP
la source
5
ac file.txt $null

Ne supprimera pas le contenu du fichier mais ne mettra pas à jour la date non plus.

8DH
la source
3

Pour le scénario que vous avez décrit (lorsque le fichier n'existe pas), c'est simple et rapide:

PS> sc example.txt $null

Toutefois, l’autre utilisation courante touchconsiste à mettre à jour l’horodatage du fichier. Si vous essayez d'utiliser mon scexemple de cette façon, le contenu du fichier sera effacé.

Jay Bazuzi
la source
1
Merci! Que scsignifie Edit: compris ("Set Content")
jsalonen
2

Pour créer un fichier vide dans Windows, la procédure rapide est la suivante:

fsutil file createnew file.name 0

Le zéro étant la taille du fichier en octets, il est donc également utile de créer un fichier volumineux (ils ne seront pas utiles pour tester la compression car ils ne contiennent pas de données réelles et ne compresseront pratiquement rien)

Jon Carlstedt
la source
2

La page Web http://xahlee.info/powershell/PowerShell_for_unixer.html suggère:

new-item -type file [filename]

et cela crée en effet un nouveau fichier de taille zéro.

Cela n’exécute pas l’autre fonction d’Unix touch, à savoir mettre à jour l’horodatage si le nom de fichier existe déjà, mais la question implique que l’utilisateur souhaite simplement créer un fichier de taille zéro de manière interactive, sans recourir au Bloc-notes.

Ghostarbeiter
la source
1

J'ai utilisé le nom "Write-File" car "Touch" n'est pas un verbe approuvé de PowerShell . Je l'alias toujours comme contact, cependant.

Touch.psm1

<#
 .Synopsis
  Creates a new file or updates the modified date of an existing file.

 .Parameter Path
  The path of the file to create or update.
#>
Function Write-File {
    [CmdletBinding()]
    Param(
       [Parameter( Mandatory=$True, Position=1 )]
       [string] $Path,
       [switch] $WhatIf,
       [System.Management.Automation.PSCredential] $Credential
    )
    $UseVerbose = $PSCmdlet.MyInvocation.BoundParameters['Verbose'].IsPresent -eq $True
    $UseDebug = $PSCmdlet.MyInvocation.BoundParameters['Debug'].IsPresent -eq $True
    $TimeStamp = Get-Date
    If( -Not [System.Management.Automation.WildcardPattern]::ContainsWildcardCharacters( $Path ) ) {
        New-Item -ItemType:File -Verbose:$UseVerbose -Debug:$UseDebug -WhatIf:$WhatIf -Credential $Credential -Path $Path -ErrorAction SilentlyContinue -Confirm:$False | Out-Null
    }
    Set-ItemProperty -Verbose:$UseVerbose -Debug:$UseDebug -WhatIf:$WhatIf -Credential $Credential -Path $Path -Name LastWriteTime -Value:$TimeStamp -Confirm:$False | Out-Null
}

Set-Alias -Name touch -Value Write-File

Export-ModuleMember -Function Write-File
Export-ModuleMember -Alias touch

Usage:

Import-Module ./Touch.psm1
touch foo.txt

Les soutiens:

  • Chemins dans d'autres répertoires
  • Credential pour les chemins de réseau
  • Verbose, Debuget WhatIfdrapeaux
  • caractères génériques (mise à jour de l'horodatage uniquement)
Erreur
la source
La New-Itemcommande a été proposée dans quatre réponses précédentes. Vous avez fourni un wrapper de 20 lignes pour cela. Pouvez-vous expliquer un peu plus clairement les avantages de votre solution par rapport aux solutions précédentes? Par exemple, quels sont ces Verbose, Debuget des WhatIfdrapeaux, etc?
Scott
Une différence importante entre cette réponse et le New-Itemfait que cela met à jour l'horodatage des fichiers existants.
Jpaugh