これはPowerShellでは約100倍簡単ですが、これでうまくいくはずです。何が起こっているのかについてのより良い説明は、にあります。 setlocal /?
、 set /?
そして for /?
。バッチは良い言語ではないので、次のようにしなければなりません。 ENABLEDELAYEDEXPANSION
そしてその用途 !FILE!
の代わりに %FILE%
バッチファイルが一度変数を設定して、それを更新しないようにします。覚えておくべき1つの鍵は、ファイル名とフォルダ名は同じではいけないということです。だからあなたはファイルとフォルダの両方を持つことはできません 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のバージョン
$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
}