Magic Quadrant™ para la gestión de acceso privilegiado 2025: Netwrix reconocida por cuarto año consecutivo. Descarga el informe.

Plataforma
Centro de recursosBlog
Uso del Cmdlet Move-Item de PowerShell para mover archivos

Uso del Cmdlet Move-Item de PowerShell para mover archivos

Oct 21, 2024

El cmdlet Move-Item te permite mover archivos, carpetas, claves de registro y subclaves en PowerShell con precisión. Puedes mover archivos individuales o múltiples, renombrarlos durante el movimiento, preservar o aplanar estructuras de carpetas y trabajar a través de rutas locales o de red. Los parámetros útiles incluyen -Recurse, -Include, -Exclude, -Filter, -Force, y -WhatIf. Para seguridad, combina los movimientos con Test-Path, manejo de errores (try/catch), y registro de actividades.

Como tarea rutinaria, los usuarios mueven elementos, como archivos y carpetas de un lugar a otro en nuestra computadora, para que los datos estén ordenados y tengan sentido. Aunque esto se puede lograr con simples opciones de copiar y pegar desde el Explorador de archivos, los usuarios avanzados pueden preferir PowerShell por su eficiencia y precisión.

Definición: Cmdlet Move-Item

El cmdlet Move-Item en PowerShell mueve un elemento de una ubicación a otra en el Explorador de archivos, manteniendo intactas sus propiedades, contenidos e ítems secundarios. Se puede utilizar de la siguiente manera:

  • Mueva un archivo o carpeta de un directorio a otro
  • Mueva múltiples archivos o directorios a la vez
  • Mueva un subclave del registro de una clave a otra

Una vez añadido a la nueva ubicación, se elimina el elemento trasladado de su ubicación original.

Como requisito previo, la nueva ubicación debe ser compatible con el mismo proveedor.

Sintaxis básica de Move-Item

El cmdlet Move-Item tiene la siguiente sintaxis básica:

      Move-Item -Path "sourceFilePath" -Destination "destinationFilePath"
      

Un ejemplo de la sintaxis con los parámetros admitidos es:

      Move-Item
    [-Path] <String[]>
    [[-Destination] <String>]
    [-Force]
    [-Filter <String>]
    [-Include <String[]>]
    [-Exclude <String[]>]
    [-PassThru]
    [-Credential <PSCredential>]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]
      

Mueva un archivo individual con Move-Item

Para mover un solo archivo de una ubicación a otra mediante PowerShell, especifique la ruta del archivo fuente y el directorio de destino en el cmdlet Move-Item. Es como sigue:

      Move-Item -Path <source file path>\<file name> -Destination <Destination path>
      

También puedes renombrar el archivo en el proceso de move.

Escenario 1 – Mover un archivo individual sin renombrarlo

Este cmdlet mueve el archivo Test.txt del directorio C:\Temp al directorio C:\Backup sin renombrar el archivo:

      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup
      

Escenario 2 – Mover un único archivo y renombrarlo en el proceso de traslado

Este cmdlet mueve el archivo Test.txt del directorio C:\Temp al directorio C:\Backup mientras lo renombra a UseCase.txt:

      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\UseCase.txt
      
Image

Mover múltiples archivos

Puede utilizar comodines en el cmdlet Move-Item para mover varios elementos a la vez, como varios archivos, de una ubicación a otra. Por ejemplo, puede mover fácilmente todos los archivos de la misma extensión de un lugar a otro.

Escenario 1 – Mover todos los archivos de la misma extensión utilizando comodines

Este cmdlet mueve todos los archivos de texto (*.txt) del directorio C:\Temp al directorio C:\Backup, dejando atrás todos los demás archivos:

      Move-Item -Path C:\Temp\*.txt -Destination C:\Backup
      

Escenario 2 – Mover todos los archivos independientemente de la extensión

Utilice el cmdlet Get-ChildItem con el parámetro -File para filtrar todos los archivos (y no carpetas) del directorio de origen. Luego canalice los resultados al cmdlet Move-Item para mover los archivos filtrados al directorio de destino, dejando atrás todas las carpetas.

En el siguiente cmdlet, el parámetro -File filtra solo los archivos en el directorio C:\Temp. El cmdlet Move-Item luego mueve esos archivos de C:\Temp al directorio C:\Backup, dejando las carpetas en C:\Temp:

      Get-ChildItem -Path C:\Temp\* -File | Move-Item -Destination C:\Backup
      

Escenario 3 – Mover archivos específicos

También es posible mover archivos específicos que tengan la misma o diferentes extensiones. En ese caso, tienes que especificar múltiples archivos proporcionando un arreglo de rutas, utilizando una coma para separar los valores múltiples.

Este cmdlet mueve dos archivos llamados Test.txt y UseCase.pdf de la carpeta C:\Temp a la carpeta C:\Backup:

      Move-Item -Path C:\Temp\test.txt, C:\Temp\UseCase.pdf -Destination C:\Backup
      

Mover un Directory

El cmdlet Move-Item de PowerShell es lo suficientemente potente como para mover un directorio con todo su contenido – archivos, carpetas, subcarpetas – a otro directorio. O puedes optar por mover todo el contenido, dejando el directorio vacío atrás. En ambos casos, la estructura de carpetas en el origen se copia al destino.

Escenario 1 – Mover un directorio completo con todo su contenido

Este cmdlet mueve la carpeta Temp junto con su contenido a la carpeta C:\Backup.

      Move-Item -Path C:\Temp -Destination C:\Backup
      

Tenga en cuenta que la carpeta Temp será eliminada de C:\ y colocada en el directorio Backup.

Escenario 2: Mover todo el contenido de un directorio dejando el directorio atrás

Este cmdlet mueve recursivamente todos los archivos y carpetas del directorio Keys a la carpeta C:\Backup.

      Move-Item -Path C:\Temp\Keys\* -Destination C:\Backup
      

Tenga en cuenta que en este caso, el directorio de origen (Keys) permanece atrás mientras todo su contenido se traslada. Este cmdlet debería dejar el directorio de origen vacío.

Mueva archivos a una ubicación de red

El cmdlet Move-Item también puede mover archivos a una ubicación de red. Simplemente proporcione la ruta de red como destino.

Considere lo siguiente:

  • Debe tener los permisos necesarios para acceder a la ubicación de red.
  • La ruta de red debe ser accesible desde la máquina donde se ejecuta el cmdlet.
  • Debe hacer una de las siguientes acciones si la ubicación de red requiere autenticación:
  • Primero asigne la unidad de red utilizando el cmdlet New-PSDrive o manualmente a través del Explorador de Windows
  • Especifique las credenciales al acceder al recurso de red

Escenario 1 – Mover un archivo a una ubicación de red

Este cmdlet mueve el archivo Text.txt de C:\Temp a una ubicación de red, que es una carpeta llamada Backup en un servidor llamado FileServer.

      Move-Item -Path C:\Temp\test.txt -Destination \\FileServer\Backup
      

Escenario 2 – Evitar sobrescritura al mover un archivo

Cuando se mueve un archivo a una ubicación de red con el cmdlet Move-Item, PowerShell sobrescribirá un archivo existente si el nombre del archivo es el mismo, incluso cuando no se proporciona el parámetro -Force.

Para evitar sobrescribir, añada una verificación antes de mover el archivo.

      if (-not (Test-Path "\\FileServer\Backup\test.txt")) {
    Move-Item -Path "C:\Temp\test.txt" -Destination "\\FileServer\Backup"
}
else {
    Write-Host "A file with the same name already exists in the destination."
}
      

Test-Path verifica si el archivo ya existe en el destino. Si es así, no moverá el archivo ad le notificará en su lugar.

Tutorial de Windows PowerShell Scripting (PDF) para Principiantes

Aprende más

Movimiento recursivo de archivos

El cmdlet Move-Item de PowerShell también puede funcionar con el parámetro -Recurse para mover todos los archivos de un directorio y de todas las carpetas y subcarpetas dentro de él, a otra ubicación. También puede limitar la función de mover a archivos de una extensión específica.

Escenario 1 – Mover recursivamente todos los archivos de la misma extensión

Este cmdlet mueve recursivamente todos los archivos PDF desde el directorio C:\Temp y sus subcarpetas al directorio C:\Backup.

      Get-ChildItem -Path C:\Temp\*.pdf -Recurse | Move-Item -Destination C:\Backup
      

Aquí, el cmdlet Get-ChildItem recupera los elementos secundarios en el directorio C:\Temp y sus subcarpetas que tienen una extensión de archivo *.pdf. Utiliza el parámetro -Recurse para hacer que la recuperación sea recursiva.

El símbolo de tubería (|) envía los resultados al cmdlet Move-Item, que mueve los archivos pdf al directorio Backup.

Nota: Por defecto, Get-ChildItem no mueve archivos ocultos. Para ello, utilice el parámetro -Force con Get-ChildItem y luego canalice los resultados a Move-Item.

Escenario 2 – Mover todos los archivos de manera recursiva

Utilice el parámetro -Recurse con el cmdlet Get-ChildItem para mover archivos de un directorio a otro de manera recursiva.

Este cmdlet mueve todos los archivos desde el directorio C:\Temp y sus subdirectorios al directorio C:\Backup. El parámetro -Recurse se utiliza para buscar a través de todos los subdirectorios de la ruta especificada mientras que el parámetro -File limita el cmdlet a recuperar archivos, excluyendo carpetas.

      Get-ChildItem -Path C:\Temp -Recurse -File | Move-Item -Destination C:\Backup
      

Tenga en cuenta que este cmdlet solo mueve archivos. Ninguna carpeta o subcarpeta se ve afectada. Además, el cmdlet mueve los archivos a la raíz del directorio de destino y no crea la estructura de carpetas del directorio de origen en el destino.

Filtrar archivos

Puede filtrar elementos basándose en criterios específicos mientras los mueve utilizando el cmdlet Move-Item. Por ejemplo, puede querer retener un archivo específico en el directorio de origen o mover archivos de un nombre o extensión específicos. Los parámetros -Filter, -Include y -Exclude son útiles para tales operaciones.

  • El parámetro -Include se utiliza para incluir archivos que coincidan con un atributo específico, para moverlos. Por ejemplo, puede especificar nombre(s) de archivo (c:\temp\test*) o extensión(es) (*.txt) como atributos, de modo que solo los archivos que coincidan con el atributo dado se muevan a la ubicación de destino.
  • El parámetro -Exclude se utiliza para excluir archivos que coinciden con un atributo específico, de ser movidos. Por ejemplo, puede especificar nombre(s) de archivo (c:\temp\test*) o extensión(es) (*.txt) como atributos, de modo que los archivos que coincidan con el atributo dado no se muevan a la ubicación de destino.
  • El parámetro -Filter es similar al parámetro -Include pero es más rápido y eficiente que -Include.

Considere lo siguiente:

  • Debe usar todo el contenido de la carpeta para incluir, excluir o filtrar datos específicos.
  • Estos parámetros pueden trabajar con comodines.

Nota:
Antes de ejecutar los cmdlets proporcionados en los escenarios a continuación, asegúrese de estar utilizando la versión más reciente de PowerShell. Si no es así, actualice su versión de PowerShell para un funcionamiento fluido.

Escenario 1 – Excluir archivos de una extensión específica

Este cmdlet mueve todos los archivos de la carpeta C:\Temp a la carpeta Backup excepto aquellos que tienen una extensión .txt.

      Move-Item -Path C:\Temp\* -Exclude *.txt -Destination C:\Backup
      

Nuevamente, en el siguiente cmdlet, el parámetro -Filter moverá todos los archivos .docx de C:\Temp a C:\Backup.

      Move-Item -Path C:\Temp\* -Filter *.docx -Destination C:\Backup
      

Escenario 2 – Mover archivos de una extensión específica

Este cmdlet solo mueve archivos de texto (.txt) de la carpeta C:\Temp a la carpeta Backup.

      Move-Item -Path C:\Temp\* -Include *.txt -Destination C:\Backup
      

Consulte la sección Move Multiple Files para funciones similares.

Escenario 3 – Mover archivos cuyos nombres comiencen con una cadena específica

Este cmdlet mueve archivos cuyos nombres comienzan con “log”. No moverá archivos que no comiencen con “log” desde C:\Temp.

      Move-Item -Path C:\Temp\* -Include log* -Destination C:\Backup
      

Escenarios avanzados de movimiento

El cmdlet Move-Item de PowerShell también puede mover archivos basándose en criterios específicos, como el tamaño del archivo, la fecha de modificación, etc. Para este propósito, puede elegir cualquiera de estos métodos:

  • Utilice el parámetro -Filter
  • Utilice Get-ChildItem con Where-Object para seleccionar archivos con atributos específicos o propiedades de fecha antes de moverlos. Sigue un proceso de tres pasos:
  • El cmdlet Get-ChildItem recupera archivos de una ubicación de origen.
  • Para filtrar por atributos, como el tamaño del archivo o la fecha de última modificación, envíe la salida al cmdlet Where-Object.
  • A continuación, canalice la salida al cmdlet Move-Item para mover los archivos filtrados.

Entonces, para mover archivos mayores de 5 GB, encuentras los archivos con Get-ChildItem, los filtras con Where-Object y los mueves con Move-Item.

Escenario 1 – Mover archivos y carpetas modificados en los últimos X días

Este cmdlet mueve todos los archivos y carpetas modificados en los últimos 30 días desde el directorio C:\Temp al directorio C:\RecentFiles.

      Get-ChildItem -Path C:\Temp\* | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-30)} | Move-Item -Destination C:\RecentFiles
      

Aunque ya debes estar bastante familiarizado con los cmdlets Get-ChildItem y Move-Item, profundicemos en Where-Object. Este cmdlet filtra los elementos modificados en los últimos 30 días.

  • $_ representa cada objeto (archivo o carpeta) que se pasa desde Get-ChildItem.
  • LastWriteTime es una propiedad del archivo/directorio que muestra la última vez que el elemento fue modificado o escrito.
  • (Get-Date).AddDays(-30) obtiene la fecha actual y le resta 30 días.

Escenario 2 – Mover archivos y carpetas más grandes que un tamaño específico

Este cmdlet mueve todos los archivos y carpetas que son más grandes de 2GB desde el directorio C:\Temp al directorio C:\LargeFiles.

      Get-ChildItem -Path C:\Temp\* | Where-Object {$_.Length -gt 2GB} | Move-Item -Destination C:\LargeFiles
      

Mantener la estructura de carpetas

El cmdlet Move-Item no copia ni recrea inherentemente toda la estructura de carpetas desde la fuente hasta la ruta de destino. Sin embargo, hay ciertas formas de retener la estructura de carpetas al mover archivos al destino:

  • Combine el cmdlet Move-Item con otros cmdlets, como Copy-Item y Remove-Item después de la verificación
  • Recrea la estructura de carpetas manualmente

Escenario 1 – Mover un directorio con su contenido y estructura de carpetas intacta

Para mover un directorio con todo su contenido y estructura de carpetas intacta, consulte la sección Move a Directory.

Escenario 2 – Mover archivos específicos mientras se preserva la estructura de carpetas

PowerShell admite funciones más complejas, donde puedes mover archivos específicos mientras recreas la estructura de carpetas en el destino.

      This script moves specific files (e.g., .pdf files) while keeping the folder structure intact:
Get-ChildItem -Path "C:\Temp" -Recurse -Filter "*.pdf" | ForEach-Object {
    $destinationPath = $_.FullName.Replace("C:\Temp", "C:\Backup")
    $destinationDir = Split-Path $destinationPath
    if (-not (Test-Path $destinationDir)) {
        New-Item -ItemType Directory -Path $destinationDir
    }
    Move-Item -Path $_.FullName -Destination $destinationPath
}
      
Image

Aquí, Get-ChildItem -Recurse obtiene todos los archivos .pdf en el directorio fuente, incluyendo subcarpetas. ForEach-Object itera a través de cada archivo encontrado.

Replace(“C:\Temp”, “C:\Backup”) ajusta la ruta de origen para crear la ruta correspondiente en el destino, y New-Item -ItemType Directory crea la estructura de carpetas si el directorio de destino no existe.

Gestionar Sobrescrituras

Ocasionalmente, puede ser necesario sobrescribir un archivo existente. Para este propósito, utilice el parámetro -Force con el cmdlet Move-Item de PowerShell.

Escenario 1 – Sobrescribir un archivo en el destino

Este cmdlet mueve el archivo test.txt de la carpeta C:\Temp a la carpeta C:\Backup sobrescribiendo cualquier archivo que pueda existir en el destino con el mismo nombre.

      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
      
Image

Escenario 2 – Sobrescribir un archivo en el destino después de la confirmación

Utilice el parámetro -Confirm para obtener un aviso de confirmación antes de sobrescribir archivos.

  • Este cmdlet muestra un mensaje de confirmación si alguno de los archivos PDF ya existe en la carpeta de destino.
      Move-Item -Path C:\Temp\*.pdf -Destination C:\Backup -Confirm -Force
      
  • Este cmdlet muestra un mensaje de confirmación si el archivo test.txt ya existe en la carpeta de destino.
      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup -Confirm -Force
      

Escriba Y y presione Enter para sobrescribir los archivos o escriba N y presione Enter para omitirlos.

Image

Pruebe los comandos antes de ejecutarlos

Utilice el parámetro -WhatIf con el cmdlet Move-Item para ver los resultados, es decir, comprobar qué sucedería si el cmdlet se ejecuta. Con este parámetro, el cmdlet no se ejecuta pero se muestran los resultados esperados. Por lo tanto, puede estar seguro de que el cmdlet no mueve ningún elemento que de otro modo no se pretendía mover.

Escenario 1 – Ver el resultado esperado de un cmdlet sin ejecutarlo

Este cmdlet muestra los resultados cuando intenta usar el cmdlet Move-Item para mover todos los elementos de la carpeta C:\Temp a la carpeta Backup.

      Move-Item -Path C:\Temp\* -Destination C:\Backup -WhatIf
      
Image

Manejo de Errores y Registro

Debería considerar implementar el manejo de errores y el registro cuando use el cmdlet Move-Item de PowerShell para asegurarse de que el script se comporte como se espera, y cualquier problema sea fácilmente rastreado e identificado. PowerShell proporciona:

  • Try-Catch para el manejo de errores
  • Write-Log para escribir en archivos de registro

Manejo básico de errores con Try-Catch

A continuación se presenta un bloque básico Try-Catch para mover un archivo con manejo de errores:

      Try {
    Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -ErrorAction Stop
} Catch {
    Write-Output "Error moving file: $_"
}
      
Image

Aquí está lo que necesitas saber.

  • El bloque Try intenta ejecutar el cmdlet Move-Item.
  • El parámetro -ErrorAction Stop indica a PowerShell que detenga la acción y lance un error en caso de un problema (por ejemplo, el archivo no existe o hay problemas de permisos), y entre en el bloque Catch.
  • -El bloque Catch captura el error que arroja el cmdlet Move-Item.
  • Write-Output muestra el mensaje de error ($_ contiene los detalles del error). También puedes reemplazar Write-Output con funciones de registro como Write-Log para guardar el error en un archivo de registro.

El parámetro -ErrorAction especifica qué debe suceder si ocurre un error. Los valores posibles son:

  • Detener – La operación se detendrá en el error
  • Continuar – La operación continuará después de un error
  • SilentlyContinue – La operación ignorará el error sin mostrar nada
  • Consultar – Solicita al usuario una entrada cuando ocurre un error
  • Ignorar – Ignora el error

Mejores prácticas de gestión de grupos de Active Directory

Aprende más

Mejores prácticas para la gestión de archivos con PowerShell

Limite el cmdlet a una carpeta de origen y destino

El cmdlet Move-Item no crea una carpeta ni la estructura de directorios en el destino. Tampoco puede mover dos archivos con el mismo nombre de dos ubicaciones de origen diferentes al mismo tiempo. Por lo tanto, es mejor especificar una fuente y una carpeta de destino en un cmdlet.

Planifique la organización de archivos

Debe tener claro la estructura de organización de sus archivos, especialmente antes de mover archivos en masa. En primer lugar, el directorio de origen debe estar organizado con archivos y carpetas debidamente mantenidos, así mientras mueve elementos, sabe qué se está moviendo. En segundo lugar, la estructura de carpetas en el destino debe estar bien definida, para que cada elemento se mueva como se desea. Esto le ayuda a localizar fácilmente cada archivo movido.

Pruebe cmdlets en datos de muestra

Pruebe el cmdlet Move-Item con datos de muestra para asegurarse de que los resultados sean los esperados. Esto ayudará a abordar cualquier descuido en sobrescrituras o conflictos.

Si no tiene suficientes datos de muestra o quiere ahorrar tiempo, utilice el parámetro -WhatIf para simular el movimiento sin ejecutar realmente el cmdlet. De esta manera, puede probar cmdlets y scripts para ver el resultado antes de realizar cambios.

Mantenga copias de seguridad

Como medida de precaución, haga una copia de seguridad de todos los archivos y carpetas importantes antes de usar el cmdlet Move-Item, especialmente de aquellos que sobrescriben –para evitar desorientarse más tarde.

Implemente el registro y el manejo de errores

El registro y manejo de errores son herramientas útiles para manejar errores inesperados. Implementar estos ayuda a identificar y rastrear cualquier error en las operaciones de Move-Item.

Puede utilizar el parámetro -ErrorAction o los bloques try-catch en sus cmdlets para el manejo de errores.

Conclusión

El cmdlet Move-Item de PowerShell posee el poder de un mago cuando se trata de gestionar y organizar archivos. Está dirigido tanto a usuarios novatos como avanzados con una sintaxis simple en su base, que puedes ampliar con parámetros y scripts. Puedes mover un solo archivo, múltiples archivos, archivos ocultos y de solo lectura, un directorio entero con todo su contenido a otra ubicación, renombrar un archivo mientras lo mueves, manejar sobrescrituras y mucho más. El cmdlet también admite registro y manejo de errores para asegurar que los movimientos de archivos sean confiables y seguros.

Netwrix Directory Manager

Preguntas frecuentes

¿Qué sucede si ya existe un archivo con el mismo nombre en el destino?

Cuando intentas mover un archivo utilizando el cmdlet Move-Item y ya existe un archivo con el mismo nombre en el destino, entonces sucede una de las siguientes situaciones:

  • El cmdlet Move-Item se ejecuta sin el parámetro -Force:
      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt
      

The cmdlet throws an error and does not move the file.

  • Con el parámetro -Force:
      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
      

PowerShell sobrescribirá el archivo en el destino sin pedir confirmación. Esto reemplazará el archivo en el destino con el archivo que está moviendo.

Consulte la sección Handle Overwrites para obtener información adicional.

¿Puedo mover varios archivos a la vez?

Sí, eso es posible con el Move-Item de PowerShell. Puedes:

  • Mueva archivos de la misma extensión, archivos con diferentes extensiones y todos los archivos desde la raíz de un directorio fuente. Puede utilizar el siguiente cmdlet para mover todos los archivos desde la raíz del directorio fuente:
      Get-ChildItem -Path C:\Temp\* -File | Move-Item -Destination C:\Backup
      

Consulte la sección Move Multiple Files para obtener detalles.

  • Para mover recursivamente todos los archivos de la misma extensión desde el directorio de origen, utilice este cmdlet:
      Get-ChildItem -Path C:\Temp\*.pdf -Recurse | Move-Item -Destination C:\Backup
      

Consulte la sección Recursive File Moving para obtener detalles.

  • Mueva el directorio de origen con todo su contenido utilizando este cmdlet:
      Move-Item -Path C:\Temp -Destination C:\Backup
      

Consulte la sección Move a Directory para obtener detalles.

¿Cómo muevo archivos con atributos específicos?

El cmdlet Move-Item puede mover archivos basándose en criterios específicos, como el tamaño del archivo, la fecha de modificación, etc. Aquí hay una lista de los atributos comunes en los que puedes filtrar:

  • Hidden
  • ReadOnly
  • Archive
  • Compressed
  • Encrypted

Utilice estos en el filtro Where-Object para dirigirse a archivos con esos atributos. También puede combinar múltiples condiciones usando -and o -or en Where-Object para filtrar archivos con múltiples atributos.

Consulte los temas Filter Files y Advanced Moving Scenarios para obtener información adicional.

¿Puedo usar Move-Item para mover archivos entre diferentes unidades?

La respuesta simple es sí. Los archivos se moverán a la ubicación que especifique como destino, ya sea la misma que la unidad de origen o una unidad diferente.

¿Cómo mueves un archivo y sobrescribes usando Move-Item?

Si desea sobrescribir un archivo en el destino con un archivo que está moviendo, utilice el parámetro -Force con Move-Item. Por ejemplo:

      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
      

PowerShell reemplazará el archivo test.txt en la carpeta Backup con el archivo test.txt de la carpeta Temp sin solicitar confirmación. Consulte la sección Handle Overwrites para obtener información adicional.

¿Cómo puedo mover archivos ocultos usando PowerShell?

Al mover una carpeta o varios archivos de la misma extensión, el cmdlet Move-Item no mueve archivos ocultos o de solo lectura. Utilice el cmdlet Get-ChildItem con el parámetro -Force para incluir archivos ocultos y de sistema en la salida, y luego canalice los resultados a Move-Item.

Puede usar este cmdlet, por ejemplo, para mover todos los archivos, incluyendo los archivos ocultos.

      Get-ChildItem -Path C:\Temp\ -Force | Move-Item -Destination C:\Backup\
      

Para mover específicamente archivos ocultos (y no archivos visibles), utilice este cmdlet:

      Get-ChildItem -Path C:\Temp\ -Force | Where-Object { $_.Attributes -match 'Hidden' } | Move-Item -Destination C:\Backup\
      

Dado que agregó una condición para filtrar archivos ocultos, el cmdlet mueve solo los archivos que tienen establecido el atributo “Oculto”.

¿Cuáles son algunos errores comunes al usar Move-Item y cómo puedo solucionarlos?

A continuación se presentan algunos errores comunes junto con su explicación y solución.

El archivo ya existe

Cuando intenta mover un archivo o carpeta a un destino donde ya existe un archivo con el mismo nombre, se muestra el siguiente error:

      Move-Item : Cannot create a file when that file already exists.
      

Utilice el parámetro -Force para sobrescribir el archivo existente.

Acceso denegado

Cuando no tienes los permisos necesarios para mover el archivo, se muestra el siguiente error

      Move-Item : Access to the path 'C:\Path\to\file.txt' is denied.
      

Podría haber muchas razones para esto, como que el archivo está protegido, la carpeta de destino requiere privilegios de administrador o el archivo está en uso por otro proceso.

Para resolver el problema, asegúrese de tener los permisos necesarios. Se recomienda que ejecute PowerShell como administrador. Además, asegúrese de que el archivo no esté en uso por otra aplicación.

Archivo bloqueado por otro proceso

Cuando el archivo que se va a mover está siendo utilizado por otro programa o proceso, se muestra el siguiente error:

      Move-Item : The process cannot access the file because it is being used by another process.
      

Para resolver el problema, cierre cualquier aplicación que esté utilizando el archivo.

La ruta es demasiado larga

De forma predeterminada, Windows tiene una longitud máxima de ruta de 260 caracteres y Move-Item fallará si la ruta de origen o destino supera este límite. PowerShell muestra el siguiente error:

      Move-Item : The specified path, file name, or both are too long.
      

Para resolver el problema, use nombres de directorio o archivo más cortos, o habilite el soporte de rutas largas en Windows 10/11 o Windows Server a través de Group Policy o el registro.

Ruta o nombre de archivo no válido

Cuando la ruta de origen o la ruta de destino es incorrecta, está mal escrita o no existe, se muestra el siguiente error:

      Move-Item : Cannot find path 'C:\InvalidPath\file.txt' because it does not exist.
      

Verifica nuevamente la ruta.

El directorio de destino no existe

Cuando el directorio de destino no existe, se muestra el siguiente error:

      Move-Item : Could not find part of the path 'C:\Backup\'
      

Asegúrese de que el directorio de destino exista. De lo contrario, créelo antes de mover los archivos.

Mover un Directory Management dentro de sí mismo

PowerShell no permite mover un directorio dentro de uno de sus subdirectorios. Al intentar hacerlo, se muestra el siguiente error:

      Move-Item : Cannot move item 'C:\Temp\' to a subdirectory of itself, 'C:\Temp\Logs\'.
      

Asegúrese de que el destino no sea una subcarpeta del directorio de origen.

¿Es posible mover archivos basándose en su contenido?

By itself, the Move-Item cmdlet cannot move files based on their content. You can, however, use Get-Content or other file reading methods with conditional logic (such as If-Else statements) to read the content of a file and then use Move-Item to move the file accordingly.

Aquí hay un script de ejemplo que verifica si un archivo contiene una palabra o frase específica. Si es así, mueve el archivo.

Nota: Realice los siguientes cambios antes de ejecutar el script:

  • Modifique la variable $searchString para que coincida con el contenido que desea filtrar.
  • Cambie $sourceDirectory y $destinationDirectory por las rutas apropiadas.
      $sourceDirectory = "C:\SourceFolder"
$destinationDirectory = "C:\DestinationFolder"
$searchString = "SpecificText"
# Get all files in the source directory
Get-ChildItem -Path $sourceDirectory -File | ForEach-Object {
    $filePath = $_.FullName
    # Read the content of the file
    $content = Get-Content -Path $filePath
    # Check if the file contains the search string
    if ($content -match $searchString) {
        # Move the file to the destination directory
        $destinationPath = Join-Path -Path $destinationDirectory -ChildPath $_.Name
        Move-Item -Path $filePath -Destination $destinationPath
        Write-Host "Moved file: $filePath to $destinationPath"
    }
    else {
        Write-Host "File does not contain search string: $filePath"
    }
}
      

Get-ChildItem obtiene todos los archivos de la carpeta de origen y ForEach-Object recorre cada archivo. Get-Content lee el contenido de cada archivo para verificar si coincide con la cadena especificada. Luego, Move-Item mueve los archivos que contienen la cadena a la carpeta de destino.

¿Qué pasa si el archivo que intento mover no existe o la ruta de origen no es válida?

En cualquiera de los casos, PowerShell lanzará un error.

      Move-Item : Cannot find path 'C:\Temp\AppLog.txt' because it does not exist.
      

De igual manera, si cualquier elemento de la ruta de destino no existe, el cmdlet falla. No crea un directorio faltante ni ningún elemento de la ruta.

Una buena idea es ejecutar Test-Path para verificar si el archivo existe. Este cmdlet devuelve $true si todos los elementos de la ruta existen y $false si falta alguno.

      Test-Path -Path C:\Backups\AppLogs
      

Falso

Image

Compartir en

Aprende más

Acerca del autor

Asset Not Found

Jonathan Blackwell

Jefe de Desarrollo de Software

Desde 2012, Jonathan Blackwell, un ingeniero e innovador, ha proporcionado liderazgo en ingeniería que ha colocado a Netwrix GroupID a la vanguardia de la gestión de grupos y usuarios para entornos de Active Directory y Azure AD. Su experiencia en desarrollo, marketing y ventas permite a Jonathan comprender completamente el mercado de Identity Management y la forma de pensar de los compradores.