script de lote do windows para criar pasta para cada arquivo em um diretório, nomeie-o, em seguida, mova o arquivo para essa pasta

1

O código:

for %%X in ("C:\Info\AUGUST 2011\Checklists\DET1__*") do (echo %%X)

lista o nome dos arquivos que eu gostaria de:

  1. Crie uma pasta com o restante do nome do arquivo (depois de DET1__ ) como o título da pasta
  2. Mova o arquivo para essa pasta específica

Eu sei que não deve ser tão difícil, mas eu realmente não estou familiarizado com o uso do Windows para scripts de shell, e eu não tenho acesso a um shell estilo UNIX no trabalho.

    
por Hortinstein 06.07.2011 / 05:57

3 respostas

7

Isso é cerca de cem vezes mais fácil no PowerShell, mas isso deve funcionar. Melhores explicações sobre o que está acontecendo podem ser encontradas em setlocal /? , set /? e for /? . Lote não é uma boa linguagem, então temos que fazer coisas como usar ENABLEDELAYEDEXPANSION e usar !FILE! em vez de %FILE% para evitar que o arquivo de lote defina os varibales uma vez e nunca os atualize. Uma chave para lembrar é que os nomes de arquivos e de pastas não podem ser os mesmos. Portanto, você não pode ter um arquivo e uma pasta foo in C:\ , por exemplo.

Eu tenho não testado isso, então faça isso sozinho antes de fazer qualquer coisa.

@ECHO OFF
SETLOCAL
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%X IN ("C:\Info\AUGUST 2011\Checklists\DET1__*") DO (
    SET FILEPATH=%~fX
    SET FILENAME=%~nxX
    SET TEMPFILE=%~fX.tmp
    MOVE "!FILEPATH!" "!TEMPFILE!"
    MKDIR "!FILEPATH!"
    MOVE "!TEMPFILE!" "!FILEPATH!\!FILENAME!"
)
ENDLOCAL

PowerShell verion:

$Files = Get-ChildItem -Path 'C:\Info\AUGUST 2011\Checklists\' -Filter 'DET1__*'
$Files | ForEach-Object {
    $FileFullName = $_.FullName
    $TempFileName = "$($FileFullName).tmp"
    $DestinationFileName = "$FileFullName\$($_.Name)"
    Move-Item $FileFullName $TempFileName
    New-Item -Path $FileFullName -ItemType Directory
    Move-Item $TempFileName $DestinationFileName
}
    
por 06.07.2011 / 06:39
1

Se você estiver disposto a usar o powershell em vez de usar scripts em lote, faça o seguinte:

$files = get-childitem "C:\Info\AUGUST 2011\Checklists\DET1__*"
ForEach ($file in $files) {
    $dirname = $file.fullname.replace("DET1__","")
    New-Item -Path $dirname -type directory
    Move-Item $file $dirname
}

Dependendo da versão do Windows, você pode ter o PowerShell instalado por padrão (Win7 / Vista). Se você tiver XP, precisará fazer o download do link do Windows Management Framework Core.

    
por 06.07.2011 / 06:37
-1

Ou use o link que cria uma única pasta com o seu arquivo selecionado ( explorer), ou uma pasta por arquivo, sem a extensão, e move os arquivos para dentro.

    
por 08.10.2013 / 13:40

Tags