Это примерно в сто раз проще в PowerShell, но это должно работать. Более подробные объяснения того, что происходит, можно найти в setlocal /?
set /?
а for /?
, Пакетный язык не является хорошим языком, поэтому мы должны делать такие вещи, как использование ENABLEDELAYEDEXPANSION
и использование !FILE!
вместо %FILE%
чтобы пакетный файл не устанавливал переменные один раз и никогда не обновлял их. Один ключ, который нужно помнить, состоит в том, что имена файлов и foldernames не могут быть одинаковыми. Так что вы не можете иметь файл и папку foo
в C:\
.
Я не проверял это на самом деле, поэтому, пожалуйста, сделайте это самостоятельно, прежде чем что-то делать.
@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
}