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


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, c'est assez gênant - en général, j'ouvre simplement une nouvelle instance de notepad et enregistre un fichier vide.

Alors, y a-t-il une manière programmatique de faire cela dans PowerShell?

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


133
2017-11-07 19:28


origine


Voir Version Windows de la commande tactile Unix Et Windows équivalent de la commande Linux 'touch'? - amiregelz
Merci. Je les ai regardés, mais la plupart des réponses se concentrent sur l'invite de commandes. J'aimerais avoir une solution PowerShell qui ne nécessite pas l'installation de nouvelles applications. - jsalonen
La question a été rejetée - les deux caractéristiques ne sont que quelques lignes de code, il suffit de mettre en œuvre les deux, pas seulement la moitié, esp. quand la moitié manquante de l’autre commande est si dangereuse. - yzorg
@yzorg: que voulez-vous dire par les deux fonctionnalités? Je ne demandais que comment créer un fichier vide dans PS comme vous pouvez le faire avec touch sous Linux. - jsalonen
@jsalonen Utiliser * nix touch sur 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:


L'utilisation du redirecteur d'ajout ">>" résout le problème de suppression d'un fichier existant:

echo $null >> filename

138
2017-11-07 19:36



Également appelé «echo null> filename» à partir d'une invite de commandes, éventuellement un fichier de commandes. Cool pour voir la version PowerShell, merci! - Mark Allen
le toucher est assez différent de celui-ci si le fichier existe déjà - jk.
l'écho est inutile, $null > filename fonctionne très bien. - alirobe
Cela écrit 2 octets de nomenclature unicode 0xFEFF pour moi. - mlt
Remarque importante: de nombreux outils Unix ne traitent pas de la nomenclature. Cela inclut git par exemple (même sur Windows). Vous aurez 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 .gitignore utiliser cette commande et se demander pourquoi cela ne fonctionnera pas. BOM est la raison. - martixy


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
    }
}

73
2018-03-25 12:47



C'est la bonne réponse pour répliquer le programme tactile Unix (avec un nom différent), mais la question est simplement de créer un nouveau fichier. - Jamie Schembri
Très, très minuscule chipie: Alors que Touch-File est conforme à la convention de nommage Verb-Noun de PS, Touch n'est pas un verbe "approuvé" (ce n'est pas une exigence importante: msdn.microsoft.com/en-us/library/ms714428.aspx). File c'est bien, au fait. Je recommande les noms Set-File ou Set-LastWriteTime ou mon préféré Update-File. Aussi, je recommanderais Add-Content $file $null au lieu de echo $null > $file. Enfin, définissez un alias avec Set-Alias touch Update-File si vous voulez continuer à utiliser la commande touch - Alan McBee


Pour créer un fichier vierge:

New-Item -ItemType file example.txt

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

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

63
2018-01-24 06:39



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


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


24
2017-11-07 19:32



C'est génial, merci! Juste ce que je voulais! Avez-vous des idées pour installer cette fonction dans le PowerShell afin qu'elle se charge automatiquement lorsque je lance le shell? - jsalonen
Ajoutez-le à votre fichier $ profile. (Exécutez le profil $ notepad pour modifier ce fichier.) - Mark Allen
Cela supprimera le contenu du fichier s'il existe. - dangph


je préfère

fc > filename

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

fc >> filename

fc est simplement un alias pour Format personnalisé. Je l'ai choisi parce que c'est une commande courte qui ne fait rien dans ce contexte, un noop. C'est aussi sympa car si tu oublies le réorienter

fc filename

au lieu de vous donner une erreur, encore une fois, il ne fait rien. Quelques autres alias cela fonctionnera sont

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

10
2017-09-30 05:10





J'ai rassemblé diverses sources et me suis retrouvé avec ce qui suit, qui répondait à 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 définir pour plusieurs fichiers:

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

7
2018-01-26 00:33



+1 pour la manière la plus efficace de changer LastWriteTime sur un fichier (ce dont j'avais besoin), bien que la question soit centrée sur la nouvelle fonctionnalité de création de fichier de la commande tactile. - Nathan Hartley
Sans utiliser une variable? - riahc3


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

Vous pouvez également renoncer à la déclaration de type de fichier (que je suppose implicite quand une extension est ajoutée), donc pour créer un fichier javascript nommé "x" dans mon répertoire actuel, je peux simplement écrire:

ni x.js

3 caractères plus rapides que le toucher!


6
2018-06-15 16:45



Ce n'est pas idempotent ni : The file 'x.js' already exists - Steven Penny


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 l'utiliser immédiatement. (Pas besoin de fermer et d'ouvrir PowerShell)

. $profile

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

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 remplacé. Au lieu de cela, vous aurez une erreur.

J'espère que ça aide

Astuce bonus:

Vous pouvez créer l'équivalent de «mkdir» en ajoutant la ligne suivante:

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

Même usage:

mkdir testfolder
mkdir testfolder\testsubfolder

4
2018-03-08 12:47





ac file.txt $null

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


4
2017-08-12 12:52