Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Powershell. Множественное копирование или вызов скриптов. (http://forum.oszone.net/showthread.php?t=349320)

epoddubniy 03-08-2021 16:46 2963547

Powershell. Множественное копирование или вызов скриптов.
 
Здравствуйте.
Дано условие: если день запуска скрипта попадает в промежуток с 25 по 31, то из соответствующего каталога диска Е: в соответствующий каталог диска D: копируются файлы (созданные вчера) с добавлением даты в конец файла.
Каталогов из которых/в которые будут копироваться файлы - много, но для каждого из них написан код
Попытался объединить это в один сплошной но код выдает ошибку.

Код:

$Data=Get-Date -Format "dd.MM.yyyy"
$CurrentDay=get-date -format "dd"

#скрипт исполнялся 3 его числа. Грешу, что ошибка где-то в сравнении. Значении переменной $CurrentDay получается равным "03", а сравнивается с 2 и 4

if (($CurrentDay -ge 2) -and ($CurrentDay -lt 4) {
        Get-ChildItem "E:\folder1" -Recurse | where-object {$_.creationtime -lt (get-date).date.adddays(1) -and $_.creationtime -ge (get-date).date.adddays(0)} |  `ForEach-Object -Process {
        Write-Host "$($_.FullName)`t→`D:\folder1\$($Data)_$($_.BaseName)"
        Copy-Item -Path $_.FullName -Destination "D:\folder1\$($_.BaseName)_$Data.adi"
    }, Get-ChildItem "E:\folder2\Резервная копия диска" -Recurse | where-object {$_.creationtime -lt (get-date).date.adddays(1) -and $_.creationtime -ge (get-
        date).date.adddays(0)
} |  `ForEach-Object -Process {
        Write-Host "$($_.FullName)`t→`D:\folder2\$($Data)_$($_.BaseName)"
        Copy-Item[ -Path $_.FullName -Destination "D:\folder2\$($_.BaseName)_$Data.adi"
    }
 }

P.S. Была мысль для каждой пары каталогов копирования "из/в" сделать свой отдельный файл с расширением .ps1, но я так и не нашел информации, как запускать скрипты друг за дружкой в powershell из командного файла

Помогите пожалуйста реализовать идею, найти ошибки, исправить код
СПАСИБО!

Iska 03-08-2021 16:51 2963550

Цитата:

Цитата epoddubniy
копируются файлы »

Цитата:

Цитата epoddubniy
Get-ChildItem "E:\folder1" -Recurse »

?

Цитата:

Цитата epoddubniy
Каталогов из которых/в которые будут копироваться файлы - много, но для каждого из них написан код »

Создайте хэш-таблицу с парами Source-Destination, подавайте её на разбор по ForEach-Object, внутри которого будет процесс копирования файлов для каждой из пар.

DJ Mogarych 03-08-2021 17:47 2963562

Код:

($CurrentDay -ge 2) -and ($CurrentDay -lt 4)
А зачем так витиевато? Не проще
Код:

(get-date).day -eq 3
?

epoddubniy 04-08-2021 13:05 2963610

Цитата:

Цитата DJ Mogarych
А зачем так витиевато? Не проще
Код:
(get-date).day -eq 3
? »

К сожалению, именно такой вариант был нужен. Нашел решение такое
Код:


       
Цитата:

       
       
               
       
       

                       

                       
                               

                                        Цитата epoddubniy
                                       
                               

                               
$CurrentDay=get-date -format "dd" »

                       
                       

               

вместо этого: вот так

       
Код:

       
$CurrentDay=get-date -format "%d"


ноль будет отбрасываться, и вывод команды уже можно будет сравнить с диапазоном чисел по условию

Цитата:

Цитата Iska
Создайте хэш-таблицу с парами Source-Destination, подавайте её на разбор по ForEach-Object, внутри которого будет процесс копирования файлов для каждой из пар. »

Помогите пожалуйста реализовать. С этими таблицами никогда не имел дела. Из того, что получилось осмыслить (в результате прочтения статей в интернете), получился вот такой код (даже не знаю, правильно или нет. Поправьте пожалуйста!):

Код:

$Data=Get-Date -Format "dd.MM.yyyy"
$CurrentDay=get-date -format "%d"

$hash=@{
pair1='Get-ChildItem "E:\folder1" -Recurse | where-object {$_.creationtime -lt (get-date).date.adddays(0) -and $_.creationtime -ge (get-date).date.adddays(-1)} | ForEach-Object -Process {Copy-Item -Path $_.FullName -Destination "D:\folder1\$($_.BaseName)_$Data.adi"}';
pair2='Get-ChildItem "E:\folder2" -Recurse | where-object {$_.creationtime -lt (get-date).date.adddays(0) -and $_.creationtime -ge (get-date).date.adddays(-1)} | ForEach-Object -Process {Copy-Item -Path $_.FullName -Destination "D:\folder2\$($_.BaseName)_$Data.adi"}'}

if (($CurrentDay -ge 2) -and ($CurrentDay -lt 5)) {$hash[@('pair1', 'pair2')]}



В POWERSHELL ISE все выполнилось без "красноты" по отдельности pair1 и pair2 тоже отрабатывают (необходимые файлы копируются). Теряюсь в догадках...

alpap 04-08-2021 22:35 2963664

Цитата:

Цитата epoddubniy
Помогите пожалуйста реализовать. С этими таблицами никогда не имел дела. »

к примеру так:
Код:

if ((Get-Date).day -NotIn 25..31) {Exit} # Запуск будет только если текущий день в диапазоне 25 - 31

$sPath = [Ordered]@{
  'C:\1a' = 'C:\2a'
  'C:\1b' = 'C:\2b'
}

$sPath.GetEnumerator()|% {
  $source      = $_.Key
  $destination = $_.Value

  gci $source
  write "$source - $destination"
}



Время: 23:43.

Время: 23:43.
© OSzone.net 2001-