Следующий сценарий является проверяемым и выполнить следующие задачи:
Проверьте, если целевая папка пуста, выход, если это не так.
Запишите действие движущихся файлов в файл с именем log.txt, который будет рассмотрен последним.
Может работать в тестовом режиме, чтобы заранее знать, что произойдет.
Вы можете определить папку источника -target папку - значение приращения
function Move-Files {
param ($Source ,$Targert,$Increment=5 , $TestMode, $Logfile)
$currentpath=pwd
if (!$LogFile) {$Logfile= "{0}\{1}" -f $currentpath,"log.txt" }
"log file is created in $logfile"
# check that destination folder is empty and create
if(!(Test-Path -Path $Targert)){
$null=New-Item -ItemType directory -Path $Targert -Force
}
else
{
$targetFiles = get-childitem $Targert -Recurse -File
if ($targetFiles -ne $null) {"Target folder not empty, Please remove it";return}
}
$files=get-childitem $source -Recurse -File
$fileCounter=0
$folderCounter=0
$Nextfolder="00001"
"Moving {0} to {1}| Total Files: {2} | Increment:{3}" -f $Source, $Targert , $files.count,$increment |tee $Logfile
$files |foreach {
$fileCounter++
if ((($fileCounter - 1) % $increment) -eq 0)
{
$folderCounter++
$Nextfolder= "{0}\{1}" -f $targert, $folderCounter.ToString("000000")
"Creating new folder {0} at counter={1}" -f $Nextfolder,$fileCounter |tee -Append $Logfile
#create Folder
$null=New-Item -ItemType directory -Path $Nextfolder -Force
}
if ($testMode)
{
"mv {0} {1}" -f $_.FullName,$Nextfolder |tee -Append $Logfile
}
else
{
mv $_.FullName -Destination $Nextfolder -Force #-WhatIf
"mv {0} {1}" -f $_.FullName,$Nextfolder |tee -Append $Logfile
}
}
}
Как использовать:
$source="i:\myfiles"
$targert="i:\My20kFiles"
$increment=5 # for a test, modify 20000
#run in test mode to know what will happen
$TestMode=$true # modify to $flase to actual moving files
Move-Files -Source $source -Targert $targert -Increment $increment -TestMode $TestMode
Пример вывода: (вы найдете то же самое в файле журнала log.txt)
Moving i:\myfiles to i:\My20kFiles| Total Files: 42 | Increment:5
Creating new folder i:\My20kFiles\000001 at counter=1
mv I:\myfiles\1.txt i:\My20kFiles\000001
mv I:\myfiles\10.txt i:\My20kFiles\000001
mv I:\myfiles\11.txt i:\My20kFiles\000001
mv I:\myfiles\12.txt i:\My20kFiles\000001
mv I:\myfiles\13.txt i:\My20kFiles\000001
Creating new folder i:\My20kFiles\000002 at counter=6
mv I:\myfiles\14.txt i:\My20kFiles\000002
mv I:\myfiles\15.txt i:\My20kFiles\000002
mv I:\myfiles\16.txt i:\My20kFiles\000002
mv I:\myfiles\17.txt i:\My20kFiles\000002
mv I:\myfiles\18.txt i:\My20kFiles\000002
Creating new folder i:\My20kFiles\000003 at counter=11
mv I:\myfiles\19.txt i:\My20kFiles\000003
mv I:\myfiles\2.txt i:\My20kFiles\000003
.................
Обновление:
Я изменил код: Добавить файл журнала как параметр. Путь по умолчанию будет текущей рабочей папкой powershell.
$ Testmode изначально ошибочно, поэтому вы перемещаете файлы. Вы можете передать параметр $ Testmode = $ true для запуска в тестовом режиме (не перемещаясь к файлам), и вы можете просмотреть файл журнала, в котором описывается, куда будут перемещаться файлы.
Вы можете настроить код, как вы хотите
ли eyou получить представление о том, когда вы выполняете 'GCI | выбрать -first 10' ;-) – LotPings
правой, но как я могу цикл через который выводит одну строку за раз, чтобы переместить ее в пункт назначения? Я знаю, что могу получить полный путь к выходу на экран с помощью -first, как get-ChildItem -recurse -Filter * .txt -file | выберите -first 10000 | % {$ _. FullName} –
Чтобы уточнить: с файлом _flattening_ вы идете в иерархии ввода при перемещении файлов в целевые папки? Это противоречит вашим образцовым данным, у которых есть уникальные имена файлов, такие как 'file1.txt' – mklement0