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
}