PDA

Показать полную графическую версию : Изменить название объекта в зависимости от i


obseoe
21-02-2014, 13:12
Добрый день! Буду благодарен, если кто-то поможет. Не очень разбираюсь в программировании, пытался найти ответ в google, но не удалось.

Есть скрипт вида:
for ($i=0; $i - le 14; $i++)
{
Copy-Item-Path $path-Destination $A%$i%-Force
}

Так, естественно не работает, вопрос как сделать, чтобы у меня копирование шло в -Destination $A0 - $A14?

Переменные:
$path="\\fs03\Distrib\123.exe"
$A0="\\fs03\inst0\123.exe"
$A1="\\fs03\inst1\123.exe"
$A2="\\fs03\inst2\123.exe"
и так далее для A

Заранее спасибо за ответ!

Iska
21-02-2014, 13:17
Во-первых, убрать пробелы между «-» и названием параметра или операции. Во-вторых, где определения переменной «$path», «$A»?

obseoe
21-02-2014, 13:23
Поправил пробелы, определения переменных добавил

Iska
21-02-2014, 14:41
obseoe, а зачем такое неудобное использование:
$A0="\\fs03\inst0\123.exe"
$A1="\\fs03\inst1\123.exe"
$A2="\\fs03\inst2\123.exe"
и так далее для A »
?! Почему не массив?

$sSourceFile = "\\fs03\Distrib\123.exe"
$aDestPaths = "\\fs03\inst0", "\\fs03\inst1", "\\fs03\inst2"

if(Test-Path -Path $sSourceFile -PathType Leaf) {
$aDestPaths | ForEach-Object -Process {
if(Test-Path -Path $_ -PathType Container) {
Copy-Item -Path $sSourceFile -Destination $_ -Force
} else {
Write-Host "Can't find destination path [$_]" -ForegroundColor Red
}
}
} else {
Write-Host "Can't find source file [$sSourceFile]" -ForegroundColor Red
}

obseoe
21-02-2014, 15:58
Спасибо за ответ!

Массив не догадался использовать, с другой стороны реальный путь для каждой переменной длиннее и их 14 штук, получается очень длинная строка, по-моему это не удобно. Поэтому я оставил эти переменные и изменил $aDestPaths = $aDestPaths = "\\fs03\inst0", "\\fs03\inst1", "\\fs03\inst2" на $aDestPaths = $A0, $A1,.., $A14

У вас очень красивый код, я пока так не умею =)

Вот только не пойму как теперь изменить, чтобы выполнялось следующее: Кроме копирования файла в нужную директорию, мне нужно запустить этот файл из этой директории (то есть сначала сделать туда change dir, а потом запуск). Написал вот так, до момента смены директории, а дальше нужно сделать запуск и я запутался:

$A0="\\fs03\inst0"
$A1="\\fs03\inst1"
$A2="\\fs03\inst2"
$B0="\\fs03\inst0\123.exe"
$B1="\\fs03\inst1\123.exe"
$B2="\\fs03\inst2\123.exe"
$sSourceFile = "\\fs03\Distrib\123.exe"
$aDestPaths = $A0, $A1, $A2
$aDestFile = $B0, $B1, $B2

if(Test-Path -Path $sSourceFile -PathType Leaf) {
$aDestPaths | ForEach-Object -Process {
if(Test-Path -Path $_ -PathType Container) {
Copy-Item -Path $sSourceFile -Destination $_ -Force
cd $_
$aDestFile ; вот собственно тут я и не пойму как его добавить, сделать еще один цикл? Но какой? Или счетчик?
} else {
Write-Host "Can't find destination path [$_]" -ForegroundColor Red
}
}
} else {
Write-Host "Can't find source file [$sSourceFile]" -ForegroundColor Red
}

Iska
21-02-2014, 16:37
с другой стороны реальный путь для каждой переменной длиннее и их 14 штук, получается очень длинная строка, … Поэтому я оставил эти переменные и изменил $aDestPaths = $aDestPaths = "\\fs03\inst0", "\\fs03\inst1", "\\fs03\inst2" на $aDestPaths = $A0, $A1,.., $A14 »
Сделайте короткую:
$aDestPaths = `
"\\fs03\inst0", `
"\\fs03\inst1", `
"\\fs03\inst2"


Кроме копирования файла в нужную директорию, мне нужно запустить этот файл из этой директории »
В чём глубинный смысл запуска …цать раз одного и того же файла?

obseoe
21-02-2014, 16:54
По поводу короткой записи понял, спасибо!

А то что касается вашего вопроса:

Есть программа бухгалтерская, обновляться не умеет (тем более автоматически), а вручную мне надоело это делать =). Обновить ее можно следующим образом: скачать с сайта свежий дистрибьютив и установить его прямо поверх уже имеющейся.
Особенностью этого приложения является то, что оно не умеет поддерживать несколько фирм, разработчик предлагает ставить для каждой фирмы программку в отдельную папку, ну мы так и сделали.
Если просто взять .exe, скачать его с сайта и прописать путь установки, то всплывают окна уведомлений (вроде тех, что: вы уверены что хотите установить программу, укажите путь и тд), если же взять и положить ее прямо в нужную директорию установка проходит в "тихом" режиме.

Поэтому я решил все немного автоматизировать:
Скрипт скачивает файл (уже сделано) и дальше должен положить его в папку дистрибьютивов (на всякий случай, в дальнейшем хотелось бы добавить проверку версий, а не ставить на угад), из которой копирует в нужные директории и устанавливает.
Все это решил запускать через планировщик, чтобы не всплывал UAC.

Iska
21-02-2014, 18:16
obseoe, ну, так Вам запускать-то приложение нужно на удалённых машинах, так?

obseoe
21-02-2014, 19:13
Не совсем понимаю к чему вопрос, поэтому подробно распишу: директория с программой на файловом сервере, запускать приложения будут с узла сеансов удаленных рабочих столов (несколько RDS серверов, где работает много пользователей), установка не прописывает никакие параметры для пользователей/реестра, поэтому ставить обновление можно прямо на файловый сервер с любой машины, все папки с этой программкой будут там.

obseoe
24-02-2014, 15:38
Вот так выглядит код на текущий момент:

$storageDir = "\\fs01\Distrib\Бухгалтерские\Бухсофт 2014"
$webclient = New-Object System.Net.WebClient
$url = "http://download.buhsoft.ru/Zarplata2014.exe"
$file = "$storageDir\Zarplata2014.exe"
$webclient.DownloadFile($url,$file)
$sSourceFile = "\\fs01\Distrib\Бухгалтерские\Бухсофт 2014\Zarplata2014.exe"
$aDestPaths = '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Agor\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Niso\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Fina\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Koe\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Goe\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Empty\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Empty2\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Dsz\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Dso\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Dso2\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Dso3\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\abc\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\abc_auto\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\aa\Zarplata2014.exe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\bb\Zarplata2014.exe"
$aDestFolders = '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Agor", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Niso", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Fina", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Koe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Goe", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Empty", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Empty2", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Dsz", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Dso", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Dso2", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\Dso3", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\abc", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\abc_auto", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\aa", '
"\\fs01\Programs_Shared_Folder\Accounting\Buhsoft\Buhsoft2014\bb"

if(Test-Path -Path $sSourceFile -PathType Leaf) {
$aDestPaths | ForEach-Object -Process {
if(Test-Path -Path $_ -PathType Container) {
Copy-Item -Path $sSourceFile -Destination $_ -Force
} else {
Write-Host "Can't find destination path [$_]" -ForegroundColor Red
}
}
} else {
Write-Host "Can't find source file [$sSourceFile]" -ForegroundColor Red
}


В итоге файл скачивается и копируется во все нужные директории, далее нужно его запустить оттуда (сделав cd в текущую директорию запуска), не понимаю как. Буду благодарен за ответ!




© OSzone.net 2001-2012