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

Het equivalent van Linux `touch` om een leeg bestand te maken met PowerShell?

Is er in PowerShell een equivalent van touch?

Bijvoorbeeld in Linux kan ik een nieuw leeg bestand maken door aan te roepen:

touch filename

Op Windows is dit nogal onhandig – meestal open ik gewoon een nieuwe instantie van kladblok en sla een leeg bestand op.

Dus is er een programmatische manier in PowerShell om dit te doen?

Ik ben niet op zoek om het gedrag van Notepad exact te evenaren, maar gewoon om het eenvoudigst mogelijke equivalent te vinden voor het maken van lege bestanden.

Antwoorden (14)

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

Het gebruik van de append redirector “>” lost het probleem op waarbij een bestaand bestand wordt verwijderd:

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

Om een leeg bestand te maken:

New-Item -ItemType file example.txt

Om de tijdstempel van een bestand bij te werken:

(gci example.txt).LastWriteTime = Get-Date
78
78
78
2013-03-25 12:47:36 +0000

Hier is een versie die een nieuw bestand aanmaakt als het niet bestaat of de tijdstempel bijwerkt als het wel bestaat.

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

In PowerShell kun je een soortgelijke Touch-functie als deze maken:

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

Gebruik:

touch myfile.txt Source

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

Ik geef de voorkeur aan

fc > filename

voor deze taak. Om met niet-lege bestanden te werken kun je

fc >> filename

fc is gewoon een alias voor Format-Custom . Ik heb het gekozen omdat het een kort commando is dat niets doet in deze context, noop . Het is ook leuk omdat als je de redirect vergeet

fc filename

in plaats van je een foutmelding te geven, het weer gewoon niets doet. Enkele andere aliassen die zullen werken zijn

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

Er zijn al een heleboel waardige antwoorden, maar ik vind het alias van New-Item wel goed, dat is gewoon: ni

Je kunt ook afzien van de bestandstype verklaring (waarvan ik aanneem dat die impliciet is als een extensie wordt toegevoegd), dus om een javascript bestand te maken met de naam ‘x’ in mijn huidige directory kan ik gewoon schrijven:

ni x.js

3 karakters sneller dan touch!

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

Ik heb verschillende bronnen bij elkaar gezocht, en kwam uit op het volgende, dat aan mijn eisen voldeed. Ik moest de schrijfdatum instellen van een DLL die gebouwd was op een machine in een andere tijdzone:

$update = get-date
Set-ItemProperty -Path $dllPath -Name LastWriteTime -Value $update

Natuurlijk kun je het ook voor meerdere bestanden instellen:

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

Het lijkt erop dat een hoop antwoorden hier geen rekening houden met bestandscodering.

Ik liep net tegen dit probleem aan, om verschillende andere redenen, maar

echo $null > $file

$null > $file

produceren beide een UTF-16-LE bestand, terwijl

New-Item $file -type file

een UTF-8 bestand produceert.

Om wat voor reden dan ook lijken fc > $file en fc >> $file ook UTF-8 bestanden te produceren.

Out-File $file -encoding utf8

geeft je een UTF-8-BOM bestand, terwijl

Out-File $file -encoding ascii

je een UTF-8 bestand geeft. Andere geldige (maar niet geteste) coderingen die Out-File ondersteunt zijn: [[-Encoding] {unknown | string | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | default | oem}]. Je kunt ook dingen naar Out-File pijpen om het bestand wat tekstdata te geven om op te slaan, en ook een -append vlag. Bijvoorbeeld:

echo $null | Out-File .\stuff.txt -Encoding ascii -Append

Dit voorbeeld werkt om de een of andere reden de tijdstempel niet bij, maar deze doet het wel:

echo foo | Out-File .\stuff.txt -Encoding ascii -Append

Hoewel het wel als neveneffect heeft dat “foo” aan het eind van het bestand wordt toegevoegd.

Als je niet zeker weet welke codering je hebt, heb ik gemerkt dat VS-Code een handige functie heeft waar rechts onderin staat wat de codering is. Ik denk dat Notepad++ ook een soortgelijke functie heeft.

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

Open je profiel bestand:

notepad $profile

Voeg de volgende regel toe:

function touch {New-Item "$args" -ItemType File}

Sla het op en laad je $profile opnieuw om het meteen te kunnen gebruiken. (Je hoeft powershell niet te sluiten en te openen)

. $profile

Om een nieuw bestand toe te voegen in de huidige directory typ je:

touch testfile.txt

Om een nieuw bestand in de ‘mijnmap’ directory toe te voegen type je:

touch myfolder\testfile.txt

Als er al een bestand met dezelfde naam bestaat, wordt dat niet overschreven. In plaats daarvan krijg je een foutmelding.

Ik hoop dat het helpt

Bonus tip:

Je kunt het equivalent van ‘mkdir’ maken door de volgende regel toe te voegen:

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

Zelfde gebruik:

mkdir testfolder
mkdir testfolder\testsubfolder
5
5
5
2013-08-12 12:52:52 +0000
ac file.txt $null

Verwijdert de inhoud van het bestand niet, maar werkt de datum ook niet bij.

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

Voor het scenario dat je beschrijft (wanneer het bestand niet bestaat), is dit snel en eenvoudig:

PS> sc example.txt $null

Het andere veelgebruikte gebruik van touch is echter om de tijdstempel van het bestand bij te werken. Als je probeert om mijn sc voorbeeld op die manier te gebruiken, zal het de inhoud van het bestand wissen.

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

om een leeg bestand in windows aan te maken, is de snelste manier de volgende:

fsutil file createnew file.name 0

De nul is de bestandsgrootte in bytes, dus dit is ook handig om grote bestanden te maken (ze zijn niet bruikbaar voor het testen van compressie, omdat ze geen echte gegevens bevatten en zullen comprimeren tot vrijwel niets)

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

De webpagina http://xahlee.info/powershell/PowerShell_for_unixer.html suggereert:

new-item -type file [filename]

en dit creëert inderdaad een nieuw bestand met grootte nul.

Dit voert de andere functie van Unix touch niet uit, namelijk het bijwerken van de tijdstempel als filename al bestaat, maar de vraag impliceert dat de gebruiker gewoon interactief een bestand van nul grootte wil maken zonder zijn toevlucht te nemen tot Kladblok.

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

Ik heb de naam “Write-File” gebruikt omdat “Touch” geen goedgekeurd PowerShell werkwoord is. Ik alias het echter nog steeds als 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

Gebruik:

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

Ondersteunt:

  • paden in andere directories
  • Credential voor netwerkpaden
  • Verbose, Debug, en WhatIf vlaggen
  • wildcards (alleen tijdstempelupdate)