Pregunta ¿Equivalente al `toque` de Linux para crear un archivo vacío con PowerShell? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

En PowerShell hay un equivalente de touch?

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

touch filename

En Windows, esto es bastante incómodo; por lo general, solo abro una nueva instancia de bloc de notas y guardo un archivo vacío.

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

No busco exactamente el comportamiento del toque, sino solo encontrar el equivalente más simple posible para crear archivos vacíos.


133


origen


Ver Versión de Windows del comando táctil Unix & ¿Windows equivalente al comando de Linux 'touch'? - amiregelz
Gracias. Los miré, pero la mayoría de las respuestas se centran en el símbolo del sistema. Me gustaría tener una solución PowerShell que no requiera que instale nuevas aplicaciones. - jsalonen
Downvoted la pregunta: ambas características son solo unas pocas líneas más de código, solo implemente ambas, no solo la mitad, esp. cuando la otra mitad que falta es tan peligrosa. - yzorg
@yzorg: ¿Qué quiere decir con ambas características? Solo estaba preguntando cómo crear un archivo vacío en PS de la manera en que puede hacerlo con touch en Linux. - jsalonen
@jsalonen Use * nix touch en un archivo existente, actualizará el último tiempo de escritura sin modificar el archivo, consulte los enlaces de @amiregelz. Esta pregunta tiene una alta clasificación de Google para powershell touch, Quería alertar a los copiadores / pegadores de que solo esta mitad puede destruir datos, cuando * nix touch no. Consulte la respuesta de @LittleBoyLost que maneja cuando el archivo ya existe. - yzorg


Respuestas:


El uso del redirector adjunto ">>" resuelve el problema donde se elimina un archivo existente:

echo $null >> filename

138



También conocido como 'echo null> filename' desde un símbolo del sistema, posiblemente un archivo por lotes. Genial para ver la versión de PowerShell, ¡gracias! - Mark Allen
tocar es bastante diferente que esto si el archivo ya existe - jk.
echo es innecesario, $null > filename Funciona genial. - alirobe
Esto escribe 2 bytes de BOM 0xFEFF unicode para mí. - mlt
Nota importante: muchas herramientas de Unix no se ocupan de la lista de materiales. Esto incluye git por ejemplo (incluso en Windows). Tendrá problemas si usa archivos creados de esta manera con herramientas que no reconocen listas de materiales. p.ej. intentas crear tu .gitignore usando este comando y me pregunto por qué no funcionará. BOM es la razón. - martixy


Aquí hay 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
    }
}

73



Esta es la respuesta correcta para replicar el programa táctil de Unix (aunque con un nombre diferente), pero la pregunta está orientada a simplemente crear un nuevo archivo. - Jamie Schembri
Muy, muy pequeña objeción: mientras Touch-File cumple con la convención de nomenclatura Verb-Sustantiva de PS, Touch no es un verbo "aprobado" (no es un requisito significativo: msdn.microsoft.com/en-us/library/ms714428.aspx) File está bien, por cierto. Recomiendo los nombres Set-File o Set-LastWriteTime o, mi favorito, Update-File. Además, lo recomendaría Add-Content $file $null en lugar de echo $null > $file. Finalmente, establezca un alias con Set-Alias touch Update-File si quieres seguir usando el comando touch - Alan McBee


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

63



¡Creo que este es el mejor enfoque! - Jayesh Bhoot
¿Funciona esto para actualizar la marca de tiempo de una carpeta? - riahc3
@ riahc3, usa esto: (gi MyFolder).LastWriteTime = Get-Date . Podrías usar eso para archivos también. - dangph
Aún más concisa: ni example.txt - Nick Cox
Este método no agrega los terribles BOM bytes y la codificación felizmente parece ser UTF-8. - Davos


En PowerShell puede crear una función Touch similar a la siguiente:

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

Uso:

touch myfile.txt

Fuente


24



Esto es genial, gracias! Justo lo que quería! ¿Alguna idea de cómo podría instalar esta función en PowerShell para que se cargue automáticamente cuando inicie el shell? - jsalonen
Añádelo a tu $ archivo de perfil. (Ejecute el perfil $ del bloc de notas para editar ese archivo). - Mark Allen
Esto eliminará el contenido del archivo si existe. - dangph


yo prefiero

fc > filename

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

fc >> filename

fc es simplemente un alias para Formato-Personalizado. Yo lo elegí porque es un comando corto que no hace nada en este contexto, un noop. También es bueno porque si olvidas el redirigir

fc filename

en lugar de darle un error, de nuevo, simplemente no hace nada. Algunos otros alias eso funcionará

ft -> Format-Table
fw -> Format-Wide

10





Recopilé varias fuentes y terminé con lo siguiente, que satisfizo mis necesidades. Necesitaba establecer la fecha de escritura de una DLL que se creó en una máquina en una zona horaria diferente:

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

Por supuesto, también puedes configurarlo para múltiples archivos:

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update

7



+1 para la forma más simple de Powershell de cambiar LastWriteTime en un archivo (que es lo que necesitaba), aunque la pregunta se centró en la nueva función de creación de archivos del comando táctil. - Nathan Hartley
Sin usar una variable? - riahc3


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

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

ni x.js

¡3 caracteres más rápido que el tacto!


6



Esto no es idempotente ni : The file 'x.js' already exists - Steven Penny


Abra su archivo de perfil:

notepad $profile

Agregue la siguiente línea:

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

Guárdelo y vuelva a cargar su perfil $ para usarlo de inmediato. (No es necesario cerrar y abrir PowerShell)

. $profile

Para agregar un nuevo archivo en el tipo de directorio actual:

touch testfile.txt

Para agregar un nuevo archivo dentro del directorio 'myfolder' escriba:

touch myfolder\testfile.txt

Si ya existe un archivo con el mismo nombre, no será invalidado. En cambio, obtendrás un error.

Espero que ayude

Consejo de bonificación:

Puede hacer que el equivalente de 'mkdir' agregue la siguiente línea:

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

Mismo uso:

mkdir testfolder
mkdir testfolder\testsubfolder

4