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.

3voto

Jonesinator Points 1793

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

PS> sc example.txt $null

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

2 votes

Merci ! Que fait sc signifie ? Edit : j'ai compris ("Set Content")

3voto

error Points 131

J'ai utilisé le nom "Write-File" parce que "Touch" n'est pas un nom de fichier. verbe approuvé de PowerShell . Je continue cependant à l'appeler "touch".

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

Utilisation :

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

Soutiens :

  • Chemins d'accès dans d'autres répertoires
  • Credential pour les chemins de réseau
  • Verbose , Debug y WhatIf drapeaux
  • caractères génériques (mise à jour de l'horodatage uniquement)

1 votes

El New-Item a été proposée dans quatre réponses précédentes. Vous avez fourni un wrapper de 20 lignes pour cette commande. Pouvez-vous expliquer un peu plus clairement les avantages de votre solution par rapport aux précédentes ? Par exemple, quels sont ces Verbose , Debug et WhatIf drapeaux, etc.

1 votes

Une différence importante entre cette réponse et New-Item est que cela met à jour l'horodatage des fichiers existants.

0 votes

Pour une raison quelconque, je dois toujours importer le module encore et encore, cela ne devrait pas arriver, n'est-ce pas ? Import-Module ./Touch.psm1

2voto

Jon Carlstedt Points 330

Pour créer un fichier vide dans Windows, la méthode la plus rapide est la suivante :

fsutil file createnew file.name 0

Le zéro est la taille du fichier en octets, ce qui est également utile pour créer des fichiers volumineux (ils ne seront pas utiles pour tester la compression car ils ne contiennent pas de données réelles et seront compressés jusqu'à pratiquement rien).

2voto

ghostarbeiter Points 133

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

new-item -type file [filename]

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

Cela ne permet pas de réaliser l'autre fonction d'Unix touch à savoir mettre à jour l'horodatage si ファイル名 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.

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