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:
Credential
d'accès aux chemins réseau Verbose
, Debug
et WhatIf
flags