Magic Quadrant™ para gerenciamento de acesso privilegiado 2025: Netwrix reconhecida pelo quarto ano consecutivo. Baixe o relatório.

Plataforma
Centro de recursosBlog
Usando o Cmdlet Move-Item do PowerShell para Mover Arquivos

Usando o Cmdlet Move-Item do PowerShell para Mover Arquivos

Oct 21, 2024

O cmdlet Move-Item permite mover arquivos, pastas, chaves de registro e subchaves no PowerShell com precisão. Você pode mover arquivos únicos ou múltiplos, renomeá-los durante a movimentação, preservar ou simplificar estruturas de pastas e trabalhar com caminhos locais ou de rede. Parâmetros úteis incluem -Recurse, -Include, -Exclude, -Filter, -Force, e -WhatIf. Para segurança, combine movimentações com Test-Path, tratamento de erros (try/catch), e registro de atividades.

Como uma tarefa rotineira, os usuários movem itens, como arquivos e pastas de um lugar para outro em nosso computador, para que os dados sejam organizados e façam sentido. Embora isso possa ser realizado com simples opções de copiar e colar a partir do Explorador de Arquivos, usuários avançados podem preferir o PowerShell pela eficiência e precisão.

Definição: Cmdlet Move-Item

O cmdlet Move-Item no PowerShell move um item de um local para outro no Explorador de Arquivos, mantendo intactas suas propriedades, conteúdos e itens filhos. Pode ser utilizado da seguinte forma:

  • Mova um arquivo ou pasta de um diretório para outro
  • Mova vários arquivos ou diretórios de uma só vez
  • Mova uma subchave do registro de uma chave para outra

Uma vez adicionado ao novo local, um item movido é removido de sua localização original.

Como pré-requisito, a nova localização deve ser suportada pelo mesmo provedor.

Sintaxe Básica do Move-Item

O cmdlet Move-Item possui a seguinte sintaxe básica:

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

Um exemplo da sintaxe com os parâmetros suportados é:

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

Mova um Único Arquivo com Move-Item

Para mover um único arquivo de um local para outro através do PowerShell, especifique o caminho do arquivo de origem e o diretório de destino no cmdlet Move-Item. É como se segue:

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

Você também pode renomear o arquivo no processo de move.

Cenário 1 – Mover um único arquivo sem renomeá-lo

Este cmdlet move o arquivo Test.txt do diretório C:\Temp para o diretório C:\Backup sem renomear o arquivo:

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

Cenário 2 – Mover um único arquivo e renomeá-lo no processo de movimentação

Este cmdlet move o arquivo Test.txt do diretório C:\Temp para o diretório C:\Backup enquanto o renomeia para UseCase.txt:

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

Mover Vários Arquivos

Você pode usar curingas no cmdlet Move-Item para mover vários itens de uma vez, como vários arquivos, de um local para outro. Por exemplo, você pode mover facilmente todos os arquivos com a mesma extensão de um local para outro.

Cenário 1 – Mover todos os arquivos da mesma extensão usando curingas

Este cmdlet move todos os arquivos de texto (*.txt) do diretório C:\Temp para o diretório C:\Backup, deixando para trás todos os outros arquivos:

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

Cenário 2 – Mover todos os arquivos independentemente da extensão

Utilize o cmdlet Get-ChildItem com o parâmetro -File para filtrar todos os arquivos (e não pastas) do diretório de origem. Em seguida, encaminhe os resultados para o cmdlet Move-Item para mover os arquivos filtrados para o diretório de destino, deixando para trás todas as pastas.

No cmdlet a seguir, o parâmetro -File filtra apenas os arquivos no diretório C:\Temp. O cmdlet Move-Item então move esses arquivos de C:\Temp para o diretório C:\Backup, deixando as pastas em C:\Temp:

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

Cenário 3 – Mover arquivos específicos

Também é possível mover arquivos específicos com a mesma ou diferentes extensões. Nesse caso, você deve especificar vários arquivos fornecendo um array de caminhos, usando uma vírgula para separar múltiplos valores.

Este cmdlet move dois arquivos chamados Test.txt e UseCase.pdf da pasta C:\Temp para a pasta C:\Backup:

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

Mover um Directory

O cmdlet Move-Item do PowerShell é poderoso o suficiente para mover um diretório com todo o seu conteúdo – arquivos, pastas, subpastas – para outro diretório. Ou você pode optar por mover todo o conteúdo, deixando o diretório vazio para trás. Em ambos os casos, a estrutura de pastas na origem é copiada para o destino.

Cenário 1 – Mover um diretório inteiro com todo o seu conteúdo

Este cmdlet move a pasta Temp com seu conteúdo para a pasta C:\Backup.

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

Observe que a pasta Temp será excluída de C:\ e colocada no diretório Backup.

Cenário 2 – Mover todo o conteúdo de um diretório, deixando o diretório para trás

Este cmdlet move recursivamente todos os arquivos e pastas do diretório Keys para a pasta C:\Backup.

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

Observe que, neste caso, o diretório de origem (Keys) permanece no lugar enquanto todo o seu conteúdo é movido. Este cmdlet deve deixar o diretório de origem vazio.

Mova arquivos para um local na rede

O cmdlet Move-Item também pode mover arquivos para um local de rede. Basta fornecer o caminho da rede como destino.

Considere o seguinte:

  • Você deve ter as permissões necessárias para acessar o local da rede.
  • O caminho da rede deve ser acessível a partir da máquina onde você está executando o cmdlet.
  • Você deve fazer uma das seguintes ações se a localização da rede exigir autenticação:
  • Mapeie primeiro a unidade de rede usando o cmdlet New-PSDrive ou manualmente pelo Windows Explorer
  • Especifique as credenciais ao acessar o recurso de rede

Cenário 1 – Mover um arquivo para um local na rede

Este cmdlet move o arquivo Text.txt de C:\Temp para um local na rede, que é uma pasta chamada Backup em um servidor chamado FileServer.

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

Cenário 2 – Prevenir a substituição ao mover um arquivo

Ao mover um arquivo para um local de rede com o cmdlet Move-Item, o PowerShell sobrescreverá um arquivo existente se o nome do arquivo for o mesmo, mesmo quando o parâmetro -Force não for fornecido.

Para evitar sobrescrita, adicione uma verificação antes de mover o arquivo.

      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 se o arquivo já existe no destino. Se sim, ele não moverá o arquivo ad notificará você em vez disso.

Tutorial de Scripting do Windows PowerShell (PDF) para Iniciantes

Saiba mais

Movimentação Recursiva de Arquivos

O cmdlet Move-Item do PowerShell também pode funcionar com o parâmetro -Recurse para mover todos os arquivos de um diretório e de todas as pastas e subpastas dentro dele, para outro local. Você também pode limitar a função de mover a arquivos de uma extensão específica.

Cenário 1 – Mover recursivamente todos os arquivos da mesma extensão

Este cmdlet move recursivamente todos os arquivos PDF da pasta C:\Temp e seus subdiretórios para a pasta C:\Backup.

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

Aqui, o cmdlet Get-ChildItem busca os itens filhos no diretório C:\Temp e seus subdiretórios que possuem uma extensão de arquivo *.pdf. Ele usa o parâmetro -Recurse para tornar a recuperação recursiva.

O pipe (|) envia os resultados para o cmdlet Move-Item, que move os arquivos pdf para o diretório Backup.

Nota: Por padrão, o Get-ChildItem não move arquivos ocultos. Para isso, use o parâmetro -Force com o Get-ChildItem e, em seguida, encaminhe os resultados para o Move-Item.

Cenário 2 – Mover todos os arquivos recursivamente

Utilize o parâmetro -Recurse com o cmdlet Get-ChildItem para mover arquivos de um diretório para outro recursivamente.

Este cmdlet move todos os arquivos do diretório C:\Temp e seus subdiretórios para o diretório C:\Backup. O parâmetro -Recurse é utilizado para pesquisar em todos os subdiretórios do caminho especificado enquanto o parâmetro -File limita o cmdlet a recuperar arquivos, excluindo pastas.

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

Observe que este cmdlet move apenas arquivos. Nenhuma pasta ou subpasta é afetada. Além disso, o cmdlet move os arquivos para a raiz do diretório de destino e não cria a estrutura de pastas do diretório de origem no destino.

Filtrar Arquivos

Você pode filtrar itens com base em critérios específicos enquanto os move usando o cmdlet Move-Item. Por exemplo, você pode querer manter um arquivo específico no diretório de origem ou mover arquivos de um nome ou extensão específicos. Os parâmetros -Filter, -Include e -Exclude são úteis para tais operações.

  • O parâmetro -Include é usado para incluir arquivos que correspondem a um atributo específico, para mover. Por exemplo, você pode especificar nome(s) de arquivo (c:\temp\test*) ou extensão(ões) (*.txt) como atributos, de modo que apenas arquivos que correspondam ao atributo dado sejam movidos para o local de destino.
  • O parâmetro -Exclude é usado para excluir arquivos que correspondem a um atributo específico, de serem movidos. Por exemplo, você pode especificar nome(s) de arquivo (c:\temp\test*) ou extensão(ões) (*.txt) como atributos, de modo que arquivos que correspondam ao atributo dado não sejam movidos para o local de destino.
  • O parâmetro -Filter é semelhante ao parâmetro -Include, mas é mais rápido e eficiente do que -Include.

Considere o seguinte:

  • Você deve usar todo o conteúdo da pasta para incluir, excluir ou filtrar dados específicos.
  • Estes parâmetros podem funcionar com curingas.

Nota:
Antes de executar os cmdlets fornecidos nos cenários abaixo, certifique-se de que está usando a versão mais recente do PowerShell. Se não, atualize sua versão do PowerShell para operações suaves.

Cenário 1 – Excluir arquivos de uma extensão específica

Este cmdlet move todos os arquivos da pasta C:\Temp para a pasta Backup exceto aqueles que possuem a extensão .txt.

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

Novamente, no seguinte cmdlet, o parâmetro -Filter moverá todos os arquivos .docx de C:\Temp para C:\Backup.

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

Cenário 2 – Mover arquivos de uma extensão específica

Este cmdlet move apenas arquivos de texto (.txt) da pasta C:\Temp para a pasta Backup.

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

Veja a seção Move Multiple Files para funções similares.

Cenário 3 – Mover arquivos que tenham nomes que começam com uma string específica

Este cmdlet move arquivos cujos nomes começam com “log”. Ele não moverá arquivos que não começam com “log” de C:\Temp.

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

Cenários Avançados de Movimentação

O cmdlet Move-Item do PowerShell também pode mover arquivos com base em critérios específicos, como tamanho do arquivo, data de modificação, entre outros. Para esse fim, você pode escolher qualquer um desses métodos:

  • Use o parâmetro -Filter
  • Use Get-ChildItem com Where-Object para selecionar arquivos com atributos específicos ou propriedades de data antes de movê-los. Segue um processo de três etapas:
  • O cmdlet Get-ChildItem recupera arquivos de um local de origem.
  • Para filtrar por atributos, como tamanho do arquivo ou data da última modificação, encaminhe a saída para o Where-Object cmdlet.
  • Em seguida, encaminhe a saída para o cmdlet Move-Item para mover os arquivos filtrados.

Então, para mover arquivos maiores que 5 GB, você encontra os arquivos com Get-ChildItem, filtra-os com Where-Object e os move com Move-Item.

Cenário 1 – Mover arquivos e pastas modificados nos últimos X dias

Este cmdlet move todos os arquivos e pastas modificados nos últimos 30 dias do diretório C:\Temp para o diretório C:\RecentFiles.

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

Embora você já deva estar bastante familiarizado com os cmdlets Get-ChildItem e Move-Item até agora, vamos mergulhar no Where-Object. Este cmdlet filtra os itens modificados nos últimos 30 dias.

  • $_ representa cada objeto (arquivo ou pasta) passado de Get-ChildItem.
  • LastWriteTime é uma propriedade do arquivo/diretório que indica a última vez que o item foi modificado ou gravado.
  • (Get-Date).AddDays(-30) gets the current date and subtracts 30 days from it.

Cenário 2 – Mover arquivos e pastas maiores que um tamanho específico

Este cmdlet move todos os arquivos e pastas maiores que 2GB do diretório C:\Temp para o diretório C:\LargeFiles.

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

Manter a Estrutura de Pastas

O cmdlet Move-Item não copia ou recria por padrão toda a estrutura de pastas da origem para o destino. No entanto, existem certas maneiras de manter a estrutura de pastas ao mover arquivos para o destino:

  • Combine o cmdlet Move-Item com outros cmdlets, como Copy-Item e Remove-Item após a verificação
  • Recrie manualmente a estrutura de pastas

Cenário 1 – Mover um diretório com seu conteúdo e estrutura de pastas intactos

Para mover um diretório com todo o seu conteúdo e estrutura de pastas intacta, consulte a seção Move a Directory.

Cenário 2 – Mover arquivos específicos preservando a estrutura de pastas

O PowerShell suporta funções mais complexas, onde você pode mover arquivos específicos enquanto recria a estrutura de pastas no 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

Aqui, Get-ChildItem -Recurse obtém todos os arquivos .pdf no diretório de origem, incluindo subpastas. ForEach-Object percorre cada arquivo encontrado.

Replace(“C:\Temp”, “C:\Backup”) ajusta o caminho de origem para criar o caminho correspondente no destino, e New-Item -ItemType Directory cria a estrutura de pastas se o diretório de destino não existir.

Gerenciar Sobrescritas

Ocasionalmente, pode ser necessário sobrescrever um arquivo existente. Para isso, utilize o parâmetro -Force com o cmdlet Move-Item do PowerShell.

Cenário 1 – Sobrescrever um arquivo no destino

Este cmdlet move o arquivo test.txt da pasta C:\Temp para a pasta C:\Backup enquanto sobrescreve qualquer arquivo que possa existir no destino com o mesmo nome.

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

Cenário 2 – Sobrescrever um arquivo no destino após confirmação

Utilize o parâmetro -Confirm para obter um prompt de confirmação antes de sobrescrever arquivos.

  • Este cmdlet exibe um prompt de confirmação se algum dos arquivos PDF já existir na pasta de destino.
      Move-Item -Path C:\Temp\*.pdf -Destination C:\Backup -Confirm -Force
      
  • Este cmdlet exibe um prompt de confirmação se o arquivo test.txt já existir na pasta de destino.
      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup -Confirm -Force
      

Digite Y e pressione Enter para sobrescrever os arquivos ou digite N e pressione Enter para ignorá-los.

Image

Teste Comandos Antes da Execução

Utilize o parâmetro -WhatIf com o cmdlet Move-Item para visualizar os resultados, ou seja, verificar o que aconteceria se o cmdlet fosse executado. Com este parâmetro, o cmdlet não é executado, mas os resultados esperados são exibidos. Assim, você pode ter certeza de que o cmdlet não moverá nenhum item que de outra forma não deveria ser movido.

Cenário 1 – Visualize o resultado esperado de um cmdlet sem executá-lo

Este cmdlet exibe os resultados quando você tenta usar o cmdlet Move-Item para mover todos os itens da pasta C:\Temp para a pasta Backup.

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

Tratamento de Erros e Registro de Atividades

Você deve considerar a implementação de tratamento de erros e registro de atividades ao usar o cmdlet Move-Item do PowerShell para garantir que o script se comporte conforme o esperado e quaisquer problemas sejam facilmente rastreados e identificados. O PowerShell fornece:

  • Try-Catch para tratamento de erros
  • Write-Log para escrever em arquivos de log

Tratamento básico de erros com Try-Catch

A seguir está um bloco Try-Catch básico para mover um arquivo com tratamento de erro:

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

Eis o que você precisa saber.

  • O bloco Try tenta executar o cmdlet Move-Item.
  • O parâmetro -ErrorAction Stop indica ao PowerShell para interromper a ação e lançar um erro em caso de problema (por exemplo, o arquivo não existe ou há problemas de permissão) e entrar no bloco Catch.
  • -O bloco Catch captura o erro que o cmdlet Move-Item gera.
  • Write-Output exibe a mensagem de erro ($_ contém os detalhes do erro). Você também pode substituir Write-Output por funções de registro como Write-Log para salvar o erro em um arquivo de log.

O parâmetro -ErrorAction especifica o que deve acontecer se ocorrer um erro. Os valores possíveis são:

  • Pare – A operação será interrompida no erro
  • Continuar – A operação continuará após um erro
  • SilentlyContinue – A operação irá ignorar o erro sem exibir nada
  • Inquire – Solicita a entrada do usuário quando ocorre um erro
  • Ignorar – Ignora o erro

Melhores práticas de gerenciamento de grupos do Active Directory

Saiba mais

Melhores práticas para gerenciamento de arquivos com PowerShell

Limite o cmdlet a uma pasta de origem e destino

O cmdlet Move-Item não cria uma pasta ou a estrutura de diretório no destino. Você também não pode mover dois arquivos com o mesmo nome de dois locais de origem diferentes ao mesmo tempo. Portanto, é melhor especificar uma pasta de origem e uma de destino em um cmdlet.

Planeje a organização de arquivos

Você deve ter clareza sobre a estrutura de organização dos seus arquivos, especialmente antes de mover arquivos em massa. Primeiramente, o diretório de origem deve estar organizado com arquivos e pastas devidamente mantidos, assim, ao mover os itens, você sabe o que está sendo movido. Em segundo lugar, a estrutura de pastas no destino deve ser bem definida, para que cada item seja movido conforme desejado. Isso ajuda você a localizar facilmente cada arquivo movido.

Teste cmdlets em dados de exemplo

Teste o cmdlet Move-Item em dados de exemplo para garantir que os resultados sejam conforme o esperado. Isso ajudará a identificar qualquer supervisão em sobrescritas ou conflitos.

Se você não tem dados de amostra suficientes ou quer economizar tempo, use o parâmetro -WhatIf para simular a movimentação sem realmente executar o cmdlet. Dessa forma, você pode testar cmdlets e scripts para visualizar o resultado antes de fazer quaisquer alterações.

Mantenha backups

Como precaução, faça backup de todos os arquivos e pastas importantes antes de usar o cmdlet Move-Item, especialmente os que sobrescrevem – para evitar desorientação posterior.

Implemente o registro e o tratamento de erros

O registro e o tratamento de erros são ferramentas úteis para lidar com erros inesperados. Implementar esses recursos ajuda a identificar e rastrear quaisquer erros nas operações de Move-Item.

Você pode usar o parâmetro -ErrorAction ou os blocos try-catch nos seus cmdlets para tratamento de erros.

Conclusão

The PowerShell Move-Item cmdlet holds the power of a wizard when it comes to managing and organizing files. It caters to both novice and advanced users with a simple syntax at its very basis, that you can build up with parameters and scripts. You can move a single file, multiple files, hidden and read-only files, an entire directory with all its contents to another location, rename a file while moving it, handle overwrites, and much more. The cmdlet also supports logging and error handling to ensure that file moves are reliable and safe.

Netwrix Directory Manager

FAQs

What happens if a file with the same name already exists at the destination?

When you try to move a file using the Move-Item cmdlet and a file with the same name already exists the destination, then one of the following happens:

  • The Move-Item cmdlet is run without the -Force parameter:
      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt
      

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

  • With the -Force parameter:
      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
      

PowerShell will overwrite the file at the destination without asking for confirmation. This will replace the file in the destination with the file you’re moving.

See the Handle Overwrites section for additional information.

Can I move multiple files at once?

Yes, that’s possible with PowerShell’s Move-Item. You can:

  • Move files of the same extension, files with different extensions, and all files from the root of a source directory. You can use the following cmdlet to move all files from the root of the source directory:
      Get-ChildItem -Path C:\Temp\* -File | Move-Item -Destination C:\Backup
      

See the Move Multiple Files section for details.

  • To recursively move all files of the same extension from the source directory, use this cmdlet:
      Get-ChildItem -Path C:\Temp\*.pdf -Recurse | Move-Item -Destination C:\Backup
      

See the Recursive File Moving section for details.

  • Move the source directory with all its contents using this cmdlet:
      Move-Item -Path C:\Temp -Destination C:\Backup
      

See the Move a Directory section for details.

How do I move files with specific attributes?

The Move-Item cmdlet can move files based on specific criteria, such as file size, date modified, and so on. Here is a list of the common attributes that you can filter on:

  • Hidden
  • ReadOnly
  • Archive
  • Compressed
  • Encrypted

Use these in the Where-Object filter to target files with those attributes. You can also combine multiple conditions using -and or -or in Where-Object to filter files with multiple attributes.

See the Filter Files and Advanced Moving Scenarios topics for additional information.

Can I use Move-Item to move files between different drives?

The simple answer is, yes. Files will be moved to the location you specify as the destination, be it the same as the source drive or a different drive.

How do you move a file and overwrite using Move-Item?

If you want to overwrite a file at the destination with a file you are moving, use the -Force parameter with Move-Item. For example:

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

PowerShell will replace the test.txt file in the Backup folder with the test.txt file from the Temp folder without asking for confirmation. See the Handle Overwrites section for additional information.

How can I move hidden files using PowerShell?

While moving a folder or multiple files of the same extension, the Move-Item cmdlet does not move hidden or read-only files. Use the Get-ChildItem cmdlet with the -Force parameter to include hidden and system files in the output, and then pipe the results to Move-Item.

You can use this cmdlet, for example, to move all the files, including hidden files.

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

To specifically move hidden files (and not visible files), use this cmdlet:

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

As you added a condition to filter hidden files, the cmdlet moves only the files that have the “Hidden” attribute set.

What are some common errors when using Move-Item and how can I troubleshoot them?

Some common errors along with their explanation and solution is given below.

File already exists

When you attempt to move a file or folder to a destination where a file already exists with the same name, the following error is displayed:

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

Use the -Force parameter to overwrite the existing file.

Access Denied

When you do not have the necessary permissions to move the file, the following error is displayed:

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

There could be many reasons for this, such as the file is protected, the destination folder requires admin privileges, or the file is in use by another process.

To resolve the issue, make sure you have the needful permissions. It is recommended that you run PowerShell as an administrator. Moreover, make sure that the file is not in use by another application.

File Locked by Another Process

When the file to be moved is being used by another program or process, the following error is displayed:

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

To resolve the issue, close any applications using the file.

Path Too Long

By default, Windows has a maximum path length of 260 characters, and Move-Item will fail if the source or destination path exceeds this limit. PowerShell displays the following error:

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

To resolve the issue, either use shorter directory or file names, or enable long path support in Windows 10/11 or Windows Server via Group Policy or the registry.

Invalid Path or File Name

When source path or destination path is incorrect, misspelled, or does not exist, the following error is displayed:

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

Double-check the path.

Destination Directory Does not Exist

When the destination directory does not exist, the following error is displayed:

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

Make sure the destination directory exists. Else create it before moving the files.

Moving a Directory into Itself

PowerShell does not allow you to move a directory into one of its sub-directories. On trying to do so, the following error is displayed:

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

Make sure the destination is not a sub-folder of the source directory.

Is it possible to move files based on their content?

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.

Here’s a sample script that checks if a file contains a specific word or phrase. If yes, it moves the file.

Note: Make the following changes before you run the script:

  • Modify the $searchString variable to match the content you want to filter.
  • Change $sourceDirectory and $destinationDirectory to the appropriate paths.
      $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 gets all the files from the source folder and ForEach-Object loops through each file. Get-Content reads the content of each file to checks if the content matches the specified string. Then Move-Item moves the files containing the string to the destination folder.

What if the file I am trying to move does not exist, or the source path is not valid?

In either case, PowerShell will throw an error.

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

Similarly, if any element of the destination path does not exist, the cmdlet fails. It does not create a missing directory or any element of the path.

A good idea is to run Test-Path to check if the file exists. This cmdlet returns $true if all elements of the path exist and $false if any are missing.

      Test-Path -Path C:\Backups\AppLogs
      

False

Image

Compartilhar em

Saiba Mais

Sobre o autor

Asset Not Found

Jonathan Blackwell

Chefe de Desenvolvimento de Software

Desde 2012, Jonathan Blackwell, um engenheiro e inovador, tem fornecido liderança em engenharia que colocou o Netwrix GroupID na vanguarda da gestão de grupos e usuários para ambientes Active Directory e Azure AD. Sua experiência em desenvolvimento, marketing e vendas permite que Jonathan compreenda totalmente o mercado de Identity Management e como os compradores pensam.