249 votes

Equivalent du `touch` de Linux pour créer un fichier vide avec PowerShell

Existe-t-il un équivalent de touch dans PowerShell ?

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

touch filename

Sous Windows, c'est assez délicat - d'habitude, j'ouvre simplement une nouvelle instance de Bloc-notes et enregistrer un fichier vide.

Existe-t-il un moyen programmatique dans PowerShell pour faire cela ?

Je ne cherche pas à correspondre exactement au comportement de touch, mais simplement à trouver l'équivalent le plus simple possible pour créer des fichiers vides.

1 votes

Merci. Je les ai regardés, mais la plupart des réponses se concentrent sur l'invite de commande. J'aimerais avoir une solution PowerShell qui ne me demande pas d'installer de nouvelles applications.

0 votes

Downvoted la question - les deux fonctionnalités ne sont que quelques lignes de code de plus, il suffit d'implémenter les deux, pas seulement la moitié, surtout quand la moitié manquante de l'autre commande est si dangereuse.

22voto

Red Tux Points 2074

Je préfère Format-Tableau pour cette tâche (fichier mnémonique touch) :

ft > filename

Pour travailler avec des fichiers non vides, vous pouvez utiliser :

ft >> filename

Je l'ai choisi parce que c'est une commande courte qui ne fait rien dans ce contexte, un noop . C'est aussi agréable parce que si vous oubliez la redirection :

ft filename

au lieu de vous donner une erreur, il ne fait rien. D'autres alias qui fonctionneront sont Format - Personnalisé ( fc ) et Format-Wide ( fw ).

11voto

martinsb Points 665

J'ai rassemblé diverses sources, et j'ai obtenu ce qui suit, qui répondait à mes besoins. J'avais besoin de définir la date d'écriture d'une DLL qui a été construite sur une machine dans un fuseau horaire différent :

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

Bien entendu, vous pouvez également le définir pour plusieurs fichiers :

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

1 votes

+1 pour le moyen le plus proche de Powershell de modifier LastWriteTime sur un fichier (ce dont j'avais besoin), bien que la question portait sur la nouvelle fonctionnalité de création de fichiers de la commande touch.

0 votes

Sans utiliser de variable ?

8voto

Garret Hoffman Points 81

Il semble qu'un grand nombre de réponses ici ne tiennent pas compte de l'encodage des fichiers.

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

echo $null > $file

$null > $file

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

New-Item $file -type file

produit un fichier UTF-8.

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

Out-File $file -encoding utf8

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

Out-File $file -encoding ascii

vous donne un fichier UTF-8. D'autres encodages valides (mais non testés) que Out-File supporte sont : [[-Encoding] {inconnu | string | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | default | oem}]. Vous pouvez aussi envoyer des données à Out-File pour donner au fichier des données textuelles à stocker, ainsi qu'un drapeau -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 celui-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 avez, j'ai trouvé que VS-Code a une fonction très pratique qui indique l'encodage dans le coin inférieur droit. Je pense que Notepad++ a aussi une fonction similaire.

0 votes

Set-Content -Path $file -value $null fait le travail et n'affecte pas l'encodage du fichier. Vérifiez également version ss64 de touch .

0 votes

Oui, dans Windows PowerShell $null > $file crée malheureusement un fichier de 2 octets avec un encodage UTF-16LE ; heureusement, dans PowerShell Core vous obtenez maintenant un fichier vraiment vide, comme c'est le cas avec New-Item dans les deux éditions. Il n'est cependant pas utile de parler d'un fichier réellement vide (longueur de 0 octet) comme ayant un codage de caractères spécifique, tel que UTF-8. Le codage des caractères n'a de sens que par rapport aux éléments suivants contenu (qui manque ici), et, plus précisément, en ce qui concerne texte contenu.

7voto

davertron Points 572

Ouvrez votre fichier de profil :

notepad $profile

Ajoutez la ligne suivante :

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

Sauvegardez-le et rechargez votre $profile afin de l'utiliser immédiatement. (Pas besoin de fermer et d'ouvrir powershell)

. $profile

Pour ajouter un nouveau fichier dans le répertoire actuel, tapez :

touch testfile.txt

Pour ajouter un nouveau fichier dans le répertoire 'myfolder', tapez :

touch myfolder\testfile.txt

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

J'espère que cela vous aidera

Conseil bonus :

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

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

Même usage :

mkdir testfolder
mkdir testfolder\testsubfolder

0 votes

Merci ! C'est le meilleur moyen

6voto

8DH Points 232
ac file.txt $null

Il ne supprime pas le contenu du fichier mais ne met pas non plus la date à jour.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X