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.
L'utilisation du redirecteur ">>" ajoute le problème de suppression d'un fichier existant:
echo $null >> filename
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
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
}
}
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
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
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!
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
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
ac file.txt $null
Ne supprimera pas le contenu du fichier mais ne mettra pas à jour la date non plus.
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.
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é.
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.
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)
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:
Credential
pour les chemins d'accès réseauVerbose
, Debug
et WhatIf
flags