Мне нужно найти способ выбрать все файлы, которые находятся отдельно в их папках, чтобы я мог вырезать и вставить их в другом месте. Все соответствующие папки находятся внутри одной основной корневой папки. Для этого есть командная строка или тотальный трюк командира?
2 ответа
6
$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 и target. Если у вас одинаковые имена файлов, они не будут перезаписаны. Вы можете добавить силу к Move-Item, чтобы это произошло.
Это может быть сжато, я новичок в PowerShell.
5
@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
в конце пакета, чтобы прочитать количество повторяемых им файлов.