Cómo Administrar Archivos Con Powershell

Todos los días, los administradores del sistema deben realizar varias operaciones estándar en los muchos archivos y carpetas de sus servidores Windows. Estas tareas a menudo implican la gestión de los datos del usuario en recursos compartidos y la garantía de copias de seguridad adecuadas. Para reducir la cantidad de trabajo manual que esto representa, puedes usar PowerShell.

En este artículo, aprenderás a usar PowerShell para:

  • Mostrar objetos en un directorio
  • Crea archivos y carpetas
  • Eliminar archivos y carpetas
  • Copiar archivos y carpetas
  • Mover archivos o directorios
  • Cambiar el nombre de los archivos
  • Cambiar extensiones de archivo
  • Y mucho más

Antes de comenzar, asegúrate de que la política de tu sistema te permita ejecutar scripts de PowerShell.

Índice De Contenidos

    Mostrar objetos en un directorio

    Para ver el contenido de un directorio en un servidor de archivos de Windows, usa el cmdlet Get-ChildItem. Para mostrar todos los archivos ocultos, agrega el parámetro -Force. El siguiente comando muestra todos los objetos raíz en la carpeta "Compartida".

    Aquí puedes aprender sobre: Solucionar: La Actualización No Es Aplicable A Tu Equipo

    • Get-ChildItem -Force \\ fs \ Shared

    Si también quieres ver todas las subcarpetas y su contenido, agrega el parámetro -Recurse:

    • Get-ChildItem -Force \\ fs \ Shared -Recurse

    Para filtrar los resultados, agrega los parámetros Filter, Exclude, Include y Path al cmdlet Get-ChildItem. Para el filtrado avanzado de objetos, usa el cmdlet Where-Object. La secuencia de comandos a continuación y busca todos los archivos ejecutables en el archivo de TI que han sido modificados después de la 1 st  de abril de 2018.

    • Get-ChildItem -Path \\ fs \ Shared \ IT -Recurse -Include * .exe | Where-Object -FilterScript {($ _. LastWriteTime -gt '2018-04-01')}

    Cree archivos y carpetas con PowerShell

    Para crear nuevos objetos con Windows PowerShell, puedes usar el cmdlet New-Item y especificar el tipo de elemento que quieres crear, como un directorio, archivo o clave de registro.

    Este comando, por ejemplo, crea una carpeta:

    • New-Item -Path '\\ fs \ Shared \ NewFolder' -ItemType Directory

    Y esto crea un archivo vacío:

    • New-Item -Path '\\ fs \ Shared \ NewFolder \ newfile.txt' -ItemType Archivo

    Crea archivos y escribe datos en ellos

    Hay al menos dos métodos integrados para crear un archivo y escribir datos en él. La primera es usar el cmdlet Out-File:

    • $ text = '¡Hola mundo!' | Archivo de salida $ text -FilePath C: \ data \ text.txt

    Para sobrescribir un archivo existente, usa el parámetro switch –Force. También puede crear archivos con el cmdlet Export-Csv, que exporta el resultado a un archivo csv que se puede abrir en Excel:

    • Get-ADusar -Filter * | Exportar-Csv -Path C: \ data \ ADusars.csv

    Crea archivos después de verificar que aún no existen

    El siguiente script comprueba si un archivo específico (pctxt) ya existe en una carpeta en particular. Si el archivo aún no existe, el script genera una lista de todas las computadoras AD y la guarda en un nuevo archivo llamado pctxt:

    # crea una serie de archivos de texto

    $ archivos = Get-ChildItem C: \ data \ *. txt | seleccione -expand nombre completo

    # comprobar si el archivo existe en la serie

    $ archivos -match "pc.txt"

    # si la coincidencia devuelve "Verdadero", salga, si devuelve "Falso", cree un informe

    if ($ files -eq 'False') {

    Get-ADComputer -Filter * | Exportar-Csv -Path C: \ data \ pc.txt

    }

    más {salir}

    Eliminar archivos y carpetas con PowerShell

    Para quitar objetos, usa el cmdlet Remove-Item. Debes tener en cuenta que se te solicitará confirmación en tiempo de ejecución si el objeto no está vacío. El siguiente ejemplo muestra cómo eliminar la carpeta de TI, todas tus subcarpetas y los archivos que contiene:

    Eliminar-elemento-Ruta '\\ fs \ shared \ it \'

    Confirmar

    El elemento en \\ pdc \ shared \ tiene hijos y no se especificó el parámetro Recurse. Si continúa, todos los niños se eliminarán con el elemento.

    Estás seguro de que quieres continuar ?

    [Y] Sí [A] Sí a todos [N] No [L] No a todos [S] Suspender [?] Ayuda

    (la opción predeterminada es "Y"):

    Si ya ha verificado que todos los objetos de una carpeta deben eliminarse, ¿Puede usar el interruptor? Recursa para omitir el paso de confirmación:

    • Eliminar-elemento -Path '\\ fs \ shared \ it \' -Recurse

    Eliminar archivos y carpetas de más de X días

    A veces es necesario limpiar archivos antiguos de un directorio en particular. A continuación, te indicamos cómo realizar esta tarea:

    $ Carpeta = "C: \ Backups"

    #remove archivos de más de 30 días

    Get-ChildItem $ Carpeta -Recurse -Force -ea 0 |

    ? {! $ _. PsIsContainer -and $ _. LastWriteTime -lt (Get-Date) .AddDays (-30)} |

    ForEach-Object {

    $_ | del -Force

    $ _. FullName | Archivo de salida C: \ log \ deletedbackups.txt -Append

    }

    Eliminar archivos después de verificar que existen

    A continuación, se explica cómo verificar que existe un archivo y eliminarlo si existe:

    $ FileName = 'C: \ data \ log.txt'

    If (Test-Path $ FileName) {

       Eliminar elemento $ FileName

    }

    Elimina archivos en varias computadoras con un solo script

    Para eliminar archivos en computadoras remotas, debes tener permisos de seguridad para acceder a ellos. Asegúrate de utilizar rutas UNC para que la secuencia de comandos determine correctamente la ubicación de los archivos.

    $ filelist = @ ("\ c $ \ Temp", "\ c $ \ Backups") # variable para eliminar archivos y carpetas

    $ computerlist = Get-Content C: \ data \ pc.txt # obtener la lista de computadoras remotas

        foreach ($ computadora en $ lista de computadoras) {

            foreach ($ archivo en $ lista de archivos) {

                $ filepath = Join-Path "\\ $ computer \" "$ filelist" # generar rutas unc a archivos y carpetas

                si (ruta de prueba $ ruta de archivo)

                {

                Eliminar elemento $ ruta de archivo -force -recurse -ErrorAction Continuar}}}

    Copia archivos y carpetas con PowerShell

    El cmdlet Copy-Item te permite copiar objetos de una ruta a otra. El siguiente comando crea una copia de seguridad copiando el archivo usars.xlsx desde una computadora remota (fs) y guardándolo en otra (fs2) a través de la red:

    • Copiar elemento -Ruta \\ fs \ Shared \ it \ usars.xlsx -Destination \\ fs2 \ Backups \ it \ usars.xlsx

    Si el archivo de destino ya existe, el intento de copia fallará. Para sobrescribir el archivo existente, incluso si es de solo lectura, usa el parámetro -Force.

    • Copiar elemento -Ruta \\ fs \ Shared \ it \ usars.xlsx -Destination \\ fs2 \ Backups \ it \ usars.xlsx -Force

    Copia archivos con PowerShell hacia o desde una computadora remota

    Si estás copiando archivos hacia o desde computadoras remotas, asegúrate de usar rutas UNC.

    Por ejemplo, usa este comando para copiar archivos desde un servidor de archivos remoto al directorio C: local:

    • Copiar elemento \\ fs \ c $ \ temp -Recurse C: \ data \

    Para copiar archivos de su directorio local a la carpeta remota, simplemente invierta las ubicaciones de origen y destino:

    • Copiar elemento C: \ data \ -Recurse \\ fs \ c $ \ temp

    Copia varios archivos de un servidor a otro a través de la red mediante un script

    También puedes copiar archivos de un servidor remoto a otro. El siguiente script copia recursivamente la carpeta \\ fs \ Shared \ temp en \\ fs \ Shared \ test:

    • Copiar elemento \\ fs \ Shared \ temp -Recurse \\ fs \ Shared \ test

    Copia solo ciertos tipos de archivos

    Para copiar solo ciertos archivos del origen al destino, usa el parámetro -Filter. Por ejemplo, el siguiente comando copia solo archivos txt de una carpeta a otra:

    • Copiar elemento -Filtro * .txt -Ruta \\ fs \ Shared \ it -Recurse -Destination \\ fs2 \ Shared \ text

    Copia archivos usando comandos XCOPY y ROBOCOPY u objetos COM

    También puedes ejecutar los comandos XCOPY y ROBOCOPY para copiar archivos o usar objetos COM, como en el siguiente ejemplo:

    • (New-Object -ComObject Scripting.FileSystemObject) .CopyFile ('\\ fs \ Shared', 'fs2 \ Backup')

    Mueve archivos y directorios con PowerShell

    El cmdlet Move-Item mueve un elemento, junto con sus propiedades, contenido y elementos secundarios, de una ubicación a otra. También puede mover un archivo o subdirectorio de un directorio a otra ubicación.

    El siguiente comando mueve un archivo de respaldo específico de una ubicación a otra:

    • Move-Item -Path \\ fs \ Shared \ Backups \ 1.bak -Destination \\ fs2 \ Backups \ archive \ 1.bak

    Este script mueve toda la carpeta Backups y su contenido a otra ubicación:

    • Move-Item -Path \\ fs \ Shared \ Backups -Destination \\ fs2 \ Backups \ archive

    El directorio Backups y todos sus archivos y subcarpetas aparecerán en el directorio de archivo.

    Cambia el nombre de los archivos con Powershell

    El cmdlet Rename-Item te permite cambiar el nombre de un objeto sin tocar su contenido. No es posible mover elementos con el comando Renombrar elemento. Para hacer esto, necesita usar el cmdlet Move-Item, como se explicó anteriormente.

    El siguiente comando cambia el nombre de un archivo:

    • Cambiar nombre de elemento -Path "\\ fs \ Shared \ temp.txt" -NewName "new_temp.txt"

    Cambiar el nombre de varios archivos

    Para cambiar el nombre de varios archivos simultáneamente, usa un script como este:

    $ files = Get-ChildItem -Path C: \ Temp #create list of files

    foreach ($ archivo en $ archivos)

    {

        $ newFileName = $ file.Name.Replace ("A", "B") #replace "A" por "B"

        Cambiar nombre de elemento $ file $ newFileName

    }

    Editar extensiones de archivo con PowerShell

    También puedes utilizar Rename-Item para cambiar las extensiones de archivo. Si quieres cambiar las extensiones de varios archivos al mismo tiempo, usa el cmdlet Rename-Item con el cmdlet Get-ChildItem.

    La siguiente secuencia de comandos cambia todas las extensiones de archivo de "txt" a "bak". El carácter comodín (*) se utiliza para incluir todos los archivos de texto:

    • Get-ChildItem \\ fs \ Shared \ Logs \ *. Txt | Renombrar artículo -Nuevo nombre {$ _. Nombre -Remplazar '\ .txt $', '. Bak'}

    Get-Content: ¿cómo leer el contenido de un archivo en PowerShell?

    El cmdlet Get-Content es uno de los comandos imprescindibles cuando se analizan las secuencias de comandos de PowerShell. Te permitirá leer el contenido de un archivo en PowerShell , que es una acción muy común. Además de leer los datos, podremos importar los datos a una variable para usarlos en el script de PowerShell. Puede utilizar Get-Content para recuperar el contenido de un archivo de registro, por ejemplo.

    Veremos que Get-Content es un poderoso cmdlet que es capaz de hacer más que simplemente recuperar el contenido de un archivo en su totalidad, de ahí el interés de dedicarle un artículo completo. Este cmdlet funciona en Windows Powershell 5.1 y PowerShell, incluida la última versión hasta la fecha: PowerShell 7.1.1.

    II. Simplemente lee el contenido de un archivo

    Para empezar, simplemente leeremos el contenido de un archivo de texto que contendrá una lista de valores. Para seguir este parte del tutorial, te invitamos a crear un archivo llamado " Paystxt " y almacenarlo en " C: \ TEMP". Este archivo debe tener el siguiente contenido:

    • Francia
    • Costa Rica
    • Bélgica
    • suizo
    • España
    • Colombia
    • Canadá
    • Brasil
    • Islandia
    • Nicaragua

    Pasos para leer el contenido en Powershell

    1. Paso 1: Para leer y mostrar el contenido de este archivo en la consola, el comando es súper simple ya que basta con especificar el nombre del archivo (o la ruta completa si no está en el directorio actual):
    2. Paso 2: Obtienes el contenido "C: \ TEMP \ Pays txt"
    C: \ TEMP \ Pays txt
    C: \ TEMP \ Pays txt
    1. Paso 3: El parámetro -Path seutilizará implícitamente para este valor. Si escribimos el comando a continuación, es el mismo.
      1. Get-Content -Path "C: \ TEMP \ Pays txt"

    NOTA: Mostrar contenido en la consola no sirve de mucho. Es más interesante cuando vamos a almacenar el contenido del archivo en una variable para poder explotarlo. Todo lo que tiene que hacer es crear una variable, por ejemplo $ Country , y darle el contenido del archivo como valor:

    • $ Country = Get-Content "C: \ TEMP \ Pays txt"

    Por curiosidad, podemos mirar el tipo de la variable $ Country después de haberle asignado un valor:

    • $ Country.GetType ()
    Cómo Administrar Archivos Con Powershell
    $ Country.GetType ()

    Podemos ver que obtenemos dos piezas de información relevantes: " Object [] " y " System.Array ". Estamos tratando con un objeto en forma de matriz de valores; es interesante!

    Para contar la cantidad de elementos en este archivo de texto, podemos hacerlo de dos formas diferentes:

    • $ Pays.Count
    • ($ País | Objeto de medida) .Count

    Tenemos 10 elementos, ya que es una matriz el primer valor corresponde al índice 0 y el último al índice 9 (ya que solo tenemos 10 elementos). Por tanto, el valor del índice 0 será "Francia" y el del índice 9 será Nicaragua.

    Si quieres consultar el valor que se encuentra en el índice 0, es decir, el primer valor, es muy sencillo:

    • $ País [0]

    O si lo prefieres, se reduce a hacer:

    • (Obtener contenido "C: \ TEMP \ Pays txt") [0]

    En la misma línea, para recuperar el último valor sin conocer el número de índice exacto, ¡hay un truco! Simplemente usa "-1" como número para el índice:

    • (Obtener contenido "C: \ TEMP \ Pays txt") [ -1 ]
    "C: \ TEMP \ Pays txt") [ -1 ]
    "C: \ TEMP \ Pays txt") [ -1 ]

    En lugar de recuperar el contenido del archivo en forma de matriz, podemos recuperarlo como una sola cadena. Simplemente agrega el parámetro -Raw al comando:

    • Get-Content -path "C: \ TEMP \ Pays txt" -raw
    Get-Content -path "C: \ TEMP \ Pays txt" -raw
    Get-Content -path "C: \ TEMP \ Pays txt" -raw

    Sigamos con algunos ejemplos prácticos.

    III. La cola de Linux a la moda de PowerShell

    En Linux, es muy común usar el comando tail para mostrar las últimas líneas de un archivo. A menudo, lo uso para consultar un archivo de registro, especialmente porque la salida es dinámica: si se agregan líneas al archivo, se mostrarán en la consola a medida que avanza.

    Es muy práctico y es posible hacer lo mismo en PowerShell, usando Get-Content y una opción llamada... -Tail y una segunda opción -¡Espera ! ?

    Sin la opción -Wait, podemos recuperar las últimas X líneas de un archivo usando -Tail por sí solo. Por ejemplo, para recuperar las últimas 5 líneas de nuestro archivo Pays txt:

    • Get-Content "C: \ TEMP \ Pays txt" -Tail 5

    Ahora, si queremos mostrar las últimas 5 líneas y esperar a recuperar las futuras líneas agregadas al archivo, usaremos esta sintaxis:

    • Get-Content "C: \ TEMP \ Pays txt" -Tail 5 -wait

    Para hacer la prueba, ejecute el comando anterior y luego modifique el archivo " Pays txt " para agregar una línea: verá que se muestra casi en tiempo real en la consola de PowerShell donde se ejecuta el comando.

    De hecho, con el comando -Wait , Get-Content mantiene el archivo abierto y comprueba cada segundo que se muestre contenido nuevo. Para finalizar la ejecución del comando, es muy sencillo, basta con realizar un "CTRL + C".

    Debes tener en cuenta que puede usar la opción -Esperar solo: en este caso, el archivo completo se mostrará en la consola y luego permanecerá pendiente.

    • Get-Content "C: \ TEMP \ Pays txt" -Espere

    IV. Obtener las primeras X líneas de un archivo

    Con el mismo espíritu, podemos recuperar las primeras líneas de un archivo. En este caso, no usaremos -Tail sino -TotalCount en su lugar. Aquí nuevamente, debe especificar el número de líneas que se mostrarán.

    • Get-Content "C: \ TEMP \ Pays txt" -TotalCount 5

    Por otro lado, y es lógico, la -Espera opción no es útil con la -TotalCount opción .

    Get-Content "C: \ TEMP \ Pays txt" -TotalCount 5
    Get-Content "C: \ TEMP \ Pays txt" -TotalCount 5

    V. NTFS: consulte una secuencia secreta en un archivo

    El archivo NTFS del sistema tiene la distinción de tener diferentes " flujos " en los que almacenar datos. Cuando se escriben datos en un archivo, se almacenan en la secuencia $ DATA. Así, cuando consultemos el archivo, leeremos el contenido de este flujo de datos.

    Además, podemos ver que nuestro archivo " Pays txt " tiene este flujo gracias al comando Get-Item:

    • Obtener el elemento "C: \ TEMP \ Pays txt" -Stream *

    También notamos que la consola solo devuelve este flujo de datos.

    C: \ TEMP \ Pays txt" -Stream *
    C: \ TEMP \ Pays txt" -Stream *

    ¡Lo bueno es que puedes crear tu propia transmisión para ocultar los datos en su interior! ?

    Todo lo que tiene que hacer es agregar datos a nuestro archivo " Pays txt ", especificando la secuencia en la que enviar los datos. Por ejemplo, vamos a crear el flujo " Creds " con el valor " Contraseña”.

    • Add-Content -Path "C: \ TEMP \ Pays txt" -Stream Creds -Value "Password"

    Ahora, si mostramos la lista de transmisiones en nuestro archivo nuevamente, obtenemos una nueva entrada:

    Add-Content -Path "C: \ TEMP \ Pays txt" -Stream Creds -Value "Password"
    Add-Content -Path "C: \ TEMP \ Pays txt" -Stream Creds -Value "Password"

    Si nos divertimos mostrando el contenido de nuestro archivo, veremos que no aparece el valor de "Contraseña" que acabo de agregar al archivo.

    • Obtener contenido "C: \ TEMP \ Pays txt"

    Además, para consultar el flujo predeterminado, puede especificar su nombre después del parámetro -Stream de Get-Content (preste atención a la sintaxis):

    • Get-Content "C: \ TEMP \ Pays txt" -Stream ': $ DATA'

    Si quieres mostrar el contenido de la transmisión "Creds" que hemos creado anteriormente, sólo decir que:

    • Obtener contenido "C: \ TEMP \ Pays txt" -Stream Creds

    El comando devolverá un solo valor: Contraseña

    La prueba en la imagen a continuación:

    Add-Content -Path "C: \ TEMP \ Pays txt" -Stream Creds -Value "Password"

    Es bueno saberlo, pero no debemos decirnos que es la solución milagrosa para ocultar contraseñas o datos confidenciales. De hecho, uno puede escanear el sistema con herramientas específicas o Get-ChildItem en busca de archivos que tengan un flujo adicional que el $ DATA predeterminado.

    Está un poco fuera de tema, pero para realizar este análisis desde una carpeta en ejecución como punto de partida:

    • Get-ChildItem -Recurse | ParaCada {Get-Item $ _. FullName -Stream *} | Donde se transmite -ne ': $ Data'

    Este comando traerá nuestro archivo Pays txt y transmitirá "Creds?". Es muy posible que los documentos de Office también estén resaltados por la salida del comando con una secuencia denominada " Zone.Identifier ". Contiene un ID que permite al sistema conocer la zona a la que pertenece este archivo (intranet, internet , etc., vis-à-vis zonas IE).

    Tal vez te interese leer sobre: Cómo Reparar El Alto Uso De CPU De Searchindexer.exe

    Conclusión

    Cómo puedes ver, esta es la manera de cómo puedes administrar tus archivos con Powershell. Al usar las instrucciones de este artículo, puedes automatizar una variedad de operaciones simples relacionadas con la administración de archivos en tus sistemas de almacenamiento de archivos y ahorrar tiempo que puede dedicar a tareas más importantes. Esperamos haberte ayudado con esta información.

    Deja un comentario

    Tu dirección de correo electrónico no será publicada.

    Go up