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

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

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

 touch filename 

Sur Windows, cela est assez gênant – généralement, je viens d'ouvrir une nouvelle instance de bloc-notes et d'enregistrer un fichier vide.

Donc, existe-t-il une manière programmée dans PowerShell pour ce faire?

L'utilisation du redirecteur d'ajout ">>" résout le problème dans lequel un fichier existant est supprimé:

 echo $null >> filename 

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

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 

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

J'ai rassemblé diverses sources, et j'ai terminé avec ce qui suit, qui a répondu à mes besoins. Je devais 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 sûr, vous pouvez également le configurer pour plusieurs fichiers:

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

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-Custom . 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 car si vous oubliez la redirection

 fc filename 

Au lieu de vous donner une erreur, encore une fois, il ne fait rien. D'autres alias qui fonctionneront seront

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

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 actuel:

 touch testfile.txt 

Pour ajouter un nouveau fichier dans le type d'annuaire 'myfolder':

 touch myfolder\testfile.txt 

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

J'espère que ça aide

Conseil de 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 
 ac file.txt $null 

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

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

Vous pouvez également renoncer à la déclaration du type de fichier (ce que je suppose est implicite lorsqu'une extension est ajoutée), afin de créer un fichier javascript avec le nom de 'x' dans mon répertoire actuel, je peux simplement écrire:

 ni x.js 

3 caractères plus rapide que le toucher!

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

 PS> sc example.txt $null 

Cependant, l'autre utilisation courante du touch est de mettre à jour l'horodatage du fichier. Si vous essayez d'utiliser mon exemple sc cette façon, cela effacera le contenu du fichier.

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'effectue pas l'autre fonction de Unix touch , à savoir mettre à jour l'horodatage si le nom du 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.

Il semble que beaucoup de réponses ici ne tiennent pas compte du codage des fichiers.

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 quelque raison que ce soit, fc > $file et 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. Les autres encodages valides (mais non testés) que supporte Out-File sont: [[-Encoding] {inconnu | Chaîne | Unicode | Bigendianunicode | Utf8 | Utf7 | Utf32 | Ascii | Par défaut | Oem}]. Vous pouvez également transférer des éléments vers Out-File pour donner au fichier quelques données textuelles à mémoriser, et également un drapeau -appendice. 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:

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

Bien qu'il ait l'effet secondaire d'ajouter "foo" à la fin du fichier.

Si vous n'êtes pas certain de l'encodage que vous avez, j'ai trouvé que VS-Code possède une fonctionnalité rusé, en ce qui concerne le coin inférieur droit, ce qui indique quel est l'encodage. Je pense que Notepad ++ a également une fonctionnalité similaire.

Pour créer un fichier vide dans Windows, le mode fastes est le suivant:

 fsutil file createnew file.name 0 

Le zéro est un format de fichier en octets, ce qui est également utile pour 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 se comprimeront à peu près)

J'ai utilisé le nom "Write-File" car "Touch" n'est pas un verbe PowerShell approuvé . Cependant, je l'appelle encore comme touche.

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 d'accès aux chemins réseau
  • Verbose , Debug et WhatIf flags
  • Caractères génériques (mise à jour de l'horodatage uniquement)