2012-11-07 19:28:02 +0000 2012-11-07 19:28:02 +0000
180
180

Équivalent de la "touche" Linux pour créer un fichier vide avec PowerShell ?

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

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

touch filename

Sous Windows, c'est assez gênant – habituellement, je n'ai qu'à ouvrir une nouvelle instance de bloc-notes et à enregistrer un fichier vide.

Alors, y a-t-il une façon programmatique dans PowerShell de faire cela ?

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

Réponses (14)

171
171
171
2012-11-07 19:36:41 +0000

L'utilisation du redirecteur append “>>” résout le problème de la suppression d'un fichier existant :

echo $null >> filename
113
113
113
2013-01-24 06:39:09 +0000

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
78
78
78
2013-03-25 12:47:36 +0000

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
    }
}
24
24
24
2012-11-07 19:32:59 +0000

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

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

Utilisation :

touch myfile.txt Source

14
14
14
2014-09-30 05:10:25 +0000

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 de Format-Custom . Je l'ai choisi parce que c'est une commande courte qui ne fait rien dans ce contexte, noop . C'est aussi agréable parce que si vous oubliez la redirection

fc filename

au lieu de vous donner une erreur, encore une fois, ça ne fait rien. Quelques autres alias qui fonctionneront sont

ft -> Format-Table
fw -> Format-Wide
11
11
11
2017-06-15 16:45:40 +0000

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 aussi renoncer à la déclaration du type de fichier (qui, je suppose, est implicite quand une extension est ajoutée), donc pour 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 vite que le toucher !

8
8
8
2013-01-26 00:33:10 +0000

J'ai rassemblé diverses sources et j'ai obtenu les résultats suivants, qui répondaient à mes besoins. J'avais besoin de fixer la date d'écriture d'une DLL 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 aussi la fixer pour plusieurs fichiers :

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update
6
6
6
2017-03-08 23:30:09 +0000

Il semble qu'une partie des réponses données 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

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 > $file et 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. D'autres codages valables (mais non testés) sont pris en charge par Out-File : [[-Encoding] {unknown | string | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | default | oem}]. Vous pouvez également transmettre des informations à 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 qu'il 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 où, dans le coin inférieur droit, il indique quel est l'encodage. Je pense que Notepad++ a également une fonction similaire.

5
5
5
2013-03-08 12:47:19 +0000

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 powerhell)

. $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 portant le même nom existe déjà, il ne sera pas masqué. Au lieu de cela, vous obtiendrez une erreur.

J'espère que cela vous aidera

Truc bonus:

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

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

Même utilisation :

5
5
5
2013-08-12 12:52:52 +0000
ac file.txt $null

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

3
3
3
2013-02-25 22:19:10 +0000

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 exemple sc de cette façon, il effacera le contenu du fichier.

2
2
2
2015-11-02 14:58:44 +0000

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 correspond à la taille du fichier en octets, ce qui est également utile pour créer des fichiers de grande taille (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 en rien)

2
2
2
2016-05-06 06:21:30 +0000

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 remplit pas l'autre fonction de l'Unix touch, à savoir mettre à jour l'horodatage si nom-de-fichier existe déjà, mais la question implique que l'utilisateur veut juste créer un fichier de taille zéro de manière interactive sans avoir recours au Bloc-notes.

2
2
2
2017-03-22 17:21:01 +0000

J'ai utilisé le nom “Write-File” parce que “Touch” n'est pas un verbe PowerShell approuvé . Je l'ai cependant toujours appelé “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

Usage :

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

Supports :

  • Chemins d'accès dans d'autres répertoires
  • Credential pour les chemins d'accès au réseau
  • Verbose, Debug, et WhatIf drapeaux
  • jokers (mise à jour de l'horodatage uniquement)