web-dev-qa-db-fra.com

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

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, cela est assez délicat. Habituellement, je viens d'ouvrir une nouvelle instance du bloc-notes et de sauvegarder un fichier vide.

Existe-t-il donc une méthode de programmation dans PowerShell?

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

157
jsalonen

L'utilisation du redirecteur ">>" ajoute le problème de suppression d'un fichier existant:

echo $null >> filename
154
Yash Agarwal

Pour créer un fichier vide:

New-Item -ItemType file example.txt

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

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

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

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

25
Ƭᴇcʜιᴇ007

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 bien parce que si vous oubliez la redirection

fc filename

au lieu de vous donner une erreur, encore une fois, cela ne fait rien. Certains autres alias qui fonctionneront sont

ft -> Format-Table
fw -> Format-Wide
10
Steven Penny

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

Vous pouvez également renoncer à la déclaration de type de fichier (ce qui, je suppose, est implicite lorsqu'une extension est ajoutée). Par conséquent, pour créer un fichier javascript portant le nom "x" dans mon répertoire actuel, je peux simplement écrire:

ni x.js

3 caractères plus rapide que le toucher!

8
Jacob E. Dawson

J'ai mis en place diverses sources et les résultats suivants ont répondu à mes besoins. J'avais besoin de définir la date d'écriture d'un DLL qui a été construit 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
8
John Saunders

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 pouvoir 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 de répertoire 'myfolder':

touch myfolder\testfile.txt

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

J'espère que ça aide

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
5
RafaelGP
ac file.txt $null

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

5
8DH

Il semble qu'un tas de réponses ici ne tiennent pas compte du codage de fichier.

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. Les autres encodages valides (mais non testés) pris en charge par Out-File sont les suivants: [[-Encoding] {unknown | chaîne | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | par défaut | oem}]. Vous pouvez également diriger des éléments vers Out-File pour donner au fichier des données de texte à stocker, ainsi qu'un indicateur -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 celle-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 possédez, j’ai trouvé que VS-Code possède une fonction astucieuse dans laquelle, dans le coin inférieur droit, il est indiqué quel est l’encodage. Je pense que Notepad ++ a également une fonctionnalité similaire.

5
Garret Hoffman

Pour le scénario que vous avez décrit (lorsque le fichier n'existe pas), la procédure est simple et rapide:

PS> sc example.txt $null

Cependant, touch est couramment utilisé pour mettre à jour l'horodatage du fichier. Si vous essayez d'utiliser mon exemple sc de cette façon, le contenu du fichier sera effacé.

3
Jay Bazuzi

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 nom_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 à Notepad.

2
ghostarbeiter

pour créer un fichier vide dans Windows, la procédure rapide est la suivante:

fsutil file createnew file.name 0

Le zéro étant la taille du fichier en octets, il est donc également utile de 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 compresseront pratiquement rien)

2
Jon Carlstedt

J'ai utilisé le nom "Write-File" car "Touch" n'est pas un verbe PowerShell approuvé . Je l'alias toujours comme contact, cependant.

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