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
}