답변:
@echo off
Setlocal EnableDelayedExpansion
SET ROOT_FOLDER=C:\TEST 1
SET TARGET_FOLDER=C:\TEST 2
FOR /D %%G IN ("%ROOT_FOLDER%"\*) do (
CD %%G
FOR /f %%A in ('dir ^| find "File(s)"') do (
set cnt=%%A
Echo %%G : !cnt!
IF !cnt! == 1 (
move /-y "*.*" "%TARGET_FOLDER%"
)
)
)
이 배치는 C:\TEST 1
하위 폴더 내부 에서 개수 파일을 찾습니다. 외로운 파일을 찾으면로 이동합니다 C:\TEST 2
. 파일 이름이 이미 존재하는 경우 덮어 쓰기를 요청합니다.
교체 C:\TEST 1
및 C:\TEST 2
자신의 값.
pause
배치의 끝에 추가 하여 에코 된 파일 수를 읽을 수 있습니다.
$src = "G:\temp"
$target = "G:\notalone"
if (Test-Path $src)
{
$folders = Get-ChildItem $src -Recurse | ?{ $_.PSIsContainer }
foreach($folder in $folders)
{
$fc = Get-ChildItem $folder.FullName | ?{!$_.PSIsContainer} | Measure-Object | Select-Object -Expand Count
if ($fc -eq 1)
{
$file = Get-ChildItem $folder.FullName | ?{!$_.PSIsContainer} | Select-Object
Write-Host "Moving " $file.FullName " to " $target
Move-Item $file.FullName $target
}
}
}
이것은 Powershell에서 작동하고 src와 대상을 대체해야합니다. 파일 이름이 같으면 덮어 쓰지 않습니다. 이를 위해 Move-Item에 힘을 추가 할 수 있습니다.
이것은 아마도 응축 될 수 있습니다. 나는 powershell을 초보자입니다.