2016-04-05 3 views
0

Я хочу переместить файл «file_to_move.txt» в каждую папку в соответствующую «сделанную» -панель.Скопируйте файлы в структуру папок в соответствующую подпапку с помощью Poweshell

так file_to_move.txt в C: \ Temp \ тест \ folder1 перемещается C: \ Temp \ Test \ folder1 \ сделано и file_to_move.txt в C: \ Temp \ Test \ folder2 перемещается в C: \ Temp \ тест \ folder2 \ сделано

... и так далее, желательно с датой%% _% времени% добавляется к имени файла.

Если папка (например, folder4 в приведенном ниже примере) не имеет file_to_move.txt, сценарий должен просто игнорировать ее и двигаться дальше.

папки Пример структуры:

  • C: \ Temp \ тест \ СДЕЛАНО
  • C: \ Temp \ тест \ folder1
  • C: \ Temp \ тест \ folder1 \ сделано
  • C : \ Temp \ тест \ folder1 \ some_other_folder
  • C: \ Temp \ тест \ folder1 \ some_other_file.txt
  • C: \ Temp \ тест \ folder1 \ file_to_move.txt
  • C: \ Temp \ тест \ folder2
  • C: \ Temp \ тест \ folder2 \ сделано
  • C: \ Temp \ тест \ folder2 \ some_other_folder
  • C: \ Temp \ тест \ folder2 \ some_other_file.txt
  • C: \ Temp \ тест \ folder2 \ file_to_move.txt
  • C: \ Temp \ Test \ folder3
  • C: \ Temp \ Test \ folder3 \ сделано
  • C: \ Temp \ Test \ folder3 \ some_other_folder
  • C: \ Temp \ test \ folder3 \ some_other_file.txt
  • C: \ Temp \ тест \ folder3 \ file_to_move.txt
  • C: \ Temp \ Test \ Folder4
  • C: \ Temp \ Test \ Folder4 \ сделано
  • C: \ Temp \ Test \ Folder4 \ some_other_folder
  • C: \ Temp \ тест \ Folder4 \ some_other_file.txt

Я экспериментировал с помощью сценария Powershell, даже если я не очень хорош в этом, и я не знаю, что это может быть сделано в стандартный пакетный скрипт. Я попытался это до сих пор:

В пакетном-скрипт:

SET ThisScriptsDirectory=%~dp0 
SET PowerShellScriptPath=%ThisScriptsDirectory%bin\movescript.ps1 
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '%PowerShellScriptPath%'" 

в movescript.ps1:

Move-Item C:\Temp\test\*\file_to_move.txt C:\Temp\test\*\done\file_to_move_$(get-date -f yyyyMMdd_HHmmss).txt 

Но это не работает. Я думаю, это недостаточно точно для работы.

В качестве бонуса можно ли все это сделать в рамках основного сценария или использовать внешний файл .PS1?

ответ

3

Командлет Get-ChildItem с фильтром можно рекурсивно извлекать из каталога все файлы file_to_move.txt. Используйте Foreach-Object (псевдоним foreach), чтобы перебрать их и объединить новый путь, используя командлет Join-Path. Чтобы скопировать элемент, вы можете использовать Copy-Item команды:

$itemsToCopy = Get-ChildItem -Path c:\Temp\Test -Filter file_to_move.txt -Recurse 
$itemsToCopy | foreach { 
    $newPath = Join-Path $_.DirectoryName 'done' 
    New-Item -Path $newPath -ItemType directory -Force | out-null 
     $_ | Copy-Item -Destination $newPath 
} 

Если вы хотите добавить метку времени, вы можете использовать Get-Date командлет и вызвать метод ToString с нужным форматом на нем, например:

(Get-Date).ToString("yyyy-dd-M_HH-mm-ss") 

Выход:

2016-05-4_15-06-02 

Теперь вы можете CONCAT имена файлов, используя строку формата и $_.Basename и $_.Extension свойство в пределах вашей петли foreach. Я оставлю это как упражнение для вас.