Я хочу написать сценарий (желательно PowerShell), который по сути скопирует файл с нескольких ПК и отправит его по FTP на сервер.
Итак, структура среды такова, что у нас есть файл на нескольких ПК (около 50 или около того), которые необходимо разместить на сервере. Иногда один из ПК может быть выключен, поэтому скрипту сначала нужно будет убедиться, что компьютер запущен и работает (возможно, результат проверки связи), затем ему нужно будет перейти в каталог на этом ПК, извлечь из него файл, переименуйте файл, поместите в исходный каталог, затем удалите файл. Соглашение об именах не имеет значения, но проще всего было бы указать дату и время. В идеале было бы лучше сначала переместить все файлы в исходный каталог, чтобы сэкономить на пропускной способности FTP, но поскольку файлы будут называться одинаковыми, файлы должны быть переименованы в процессе перемещения. Перемещать, а не копировать, потому что каталог должен быть пустым, чтобы файл можно было воссоздать на следующий день. Итак, после перемещения в исходный каталог, теперь все файлы должны быть отправлены по FTP на сервер для обработки.
После всего этого нам нужно знать, какие компьютеры в списке не ответили, чтобы мы могли вручную получить файл, чтобы сценарий должен был вывести файл (текстовый текст в порядке), который покажет, какие компьютеры были отключены.
Все в одном домене, и сценарий будет запускаться с сервера с правами администратора.
Спасибо!
Отредактировано:
$down = "C:\Script\log\down-hosts.log"
$nofile = "C:\Script\log\no-file.log"
$computers = Get-Content "C:\Script\list\Computers.txt"
$TargetPath = "\\server\directory\directory\"
$SourceFileName = "file_name.csv"
foreach ($computer in $computers) {
if ( Test-Connection -ComputerName $computer -Count 1 -ErrorAction SilentlyContinue
{
$sourcefilePath = "\\$computer\c$\UPS CSV Exports\$SourceFileName"
Write-Host "$computer is up"
Write-Host "Copying $SourceFilePath ..."
Try {
If (Test-Path $SourceFilePath) {
Move-Item $SourceFilePath "$TargetPath\$computer`_$SourceFileName" -force
} Else {
#Throw "$SourceFilePath does not exist"
Write-Host "$computer file does not exist"
"$computer $SourceFileName file does not exist" | Out-File $nofile -append
}
} Catch {
Write-Host "Error: $($Error[0].Exception.Message)"
}
} Else {
Write-Host "$computer is down"
"$computer is down $(get-date)" | Out-File $down -append
}
}
Некоторые новые объяснения:
Использование Test-Connection
чтобы проверить, включен ли хост (нет пинга). - Сохранил это, как хорошо работало
Использование New-Item
не обязательно.
Использование Move-Item
вместо протокола FTP.
Добавлены новые функции журнала: "$computer $SourceFileName file does not exist" | Out-File $nofile -append
который предлагает второй журнал, показывающий, что файл не существует.
Добавлена новая функция журнала: "$computer is down $(get-date)" | Out-File $down -append
который показывает, что компьютер выключен, но также ставит на нем дату / время.