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

¿Equivalente de Linux `touch` para crear un archivo vacío con PowerShell?

En PowerShell, ¿hay algún equivalente a touch?

Por ejemplo, en Linux puedo crear un nuevo archivo vacío invocando:

touch filename

En Windows esto es bastante incómodo - normalmente sólo abro una nueva instancia del bloc de notas y guardo un archivo vacío.

Entonces, ¿hay una forma programática en PowerShell para hacer esto?

No estoy buscando un comportamiento exactamente igual al del touch, sino sólo encontrar el equivalente más simple posible para crear archivos vacíos.

Respuestas (14)

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

El uso de la redirección “>>” resuelve el problema de la eliminación de un archivo existente:

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

Para crear un archivo en blanco:

New-Item -ItemType file example.txt

Para actualizar la marca de tiempo de un archivo:

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

Esta es una versión que crea un nuevo archivo si no existe o actualiza la marca de tiempo si 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

En PowerShell puedes crear una función Touch similar como esta

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

Uso:

touch myfile.txt Fuente

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

Yo prefiero

fc > filename

para esta tarea. Para trabajar con archivos no vacíos puedes usar

fc >> filename

fc es simplemente un alias de Format-Custom . Lo elegí porque es un comando corto que no hace nada en este contexto, noop . También es bueno porque si te olvidas de la redirección

fc filename

en lugar de darte un error, de nuevo simplemente no hace nada. Algunos otros alias que funcionarán son

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

Ya hay un montón de respuestas dignas, pero me gusta bastante el alias de New-Item, que es simplemente: ni

También se puede prescindir de la declaración del tipo de archivo (que supongo que está implícita cuando se añade una extensión), así que para crear un archivo javascript con el nombre de ‘x’ en mi directorio actual puedo simplemente escribir:

ni x.js

¡3 caracteres más rápido que tocar!

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

Reuní varias fuentes, y terminé con lo siguiente, que satisfacía mis necesidades. Necesitaba establecer la fecha de escritura de una DLL que fue construida en una máquina en una zona horaria diferente:

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

Por supuesto, también se puede establecer para múltiples archivos:

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

Parece que un montón de respuestas aquí no tienen en cuenta la codificación del archivo.

Acabo de encontrarme con este problema, por varias otras razones, pero

echo $null > $file

$null > $file

ambos producen un archivo UTF-16-LE, mientras que

New-Item $file -type file

produce un archivo UTF-8.

Por alguna razón fc > $file y fc >> $file, también parecen producir archivos UTF-8.

Out-File $file -encoding utf8

te da un archivo UTF-8-BOM, mientras que

Out-File $file -encoding ascii

te da un archivo UTF-8. Otras codificaciones válidas (pero no probadas) que soporta Out-File son: [[-Encoding] {desconocida | cadena | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | por defecto | oem}]. También puede canalizar cosas a Out-File para dar al archivo algunos datos de texto para almacenar, y también una bandera -append. Por ejemplo:

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

este ejemplo no actualiza la marca de tiempo por alguna razón, pero este otro sí:

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

Aunque tiene el efecto secundario de añadir “foo” al final del archivo.

Si no estás seguro de la codificación que tienes, he descubierto que VS-Code tiene una característica ingeniosa donde en la esquina inferior derecha dice cuál es la codificación. Creo que Notepad++ también tiene una función similar.

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

Abra su archivo de perfil:

notepad $profile

Añade la siguiente línea:

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

Guárdalo y vuelve a cargar tu $perfil para poder utilizarlo directamente. (No es necesario cerrar y abrir powershell)

. $profile

Para añadir un nuevo archivo en el directorio actual escriba:

touch testfile.txt

Para añadir un nuevo archivo dentro del directorio ‘myfolder’ escriba:

touch myfolder\testfile.txt

Si ya existe un archivo con el mismo nombre, no se sobrescribirá. En su lugar, obtendrá un error.

Espero que te sirva de ayuda

Consejo de bonificación:

Puedes hacer el equivalente a ‘mkdir’ añadiendo la siguiente línea:

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

El mismo uso:

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

No borra el contenido del archivo pero tampoco actualiza la fecha.

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

Para el escenario que has descrito (cuando el archivo no existe), esto es rápido y fácil:

PS> sc example.txt $null

Sin embargo, el otro uso común de touch es actualizar la marca de tiempo del archivo. Si tratas de usar mi ejemplo de sc de esa manera, se borrará el contenido del archivo.

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

para crear un archivo vacío en windows, la forma más rápida es la siguiente:

fsutil file createnew file.name 0

El cero es el tamaño del archivo en bytes, así que esto también es útil para crear archivos grandes (no serán útiles para probar la compresión ya que no contienen datos reales y se comprimirán hasta casi nada)

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

La página web http://xahlee.info/powershell/PowerShell_for_unixer.html sugiere:

new-item -type file [filename]

y esto efectivamente crea un nuevo archivo de tamaño cero.

Esto no realiza la otra función de Unix touch, es decir, actualizar la marca de tiempo si filename ya existe, pero la pregunta implica que el usuario sólo quiere crear un archivo de tamaño cero de forma interactiva sin recurrir al Bloc de notas.

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

Utilicé el nombre “Write-File” porque “Touch” no es un verbo de PowerShell aprobado . Sin embargo, sigo usando el alias “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

Uso:

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

Soporta:

  • Rutas en otros directorios
  • Credential para rutas de red
  • banderas Verbose, Debug, y WhatIf
  • comodines (sólo actualización de marcas de tiempo)