PDA

Показать полную графическую версию : Редактирование ini файлов.


SahatoshL
11-04-2016, 12:33
Здравствуйте! Возникла проблемка с редактированием ini файлов с помощью Powershell.

Есть ini файлик в котором прописывается адрес сервера по которому клиентская часть общается с сервером.

Сейчас переходим на другой сервер и подключатся к ста пользователям и менять вручную не очень приятно.

С Powershell знаком совсем мало на уровне открыть закрыть процесс, посмотреть по сетке на каких компах он запущен.

Нашел в интернете вот такой вот примерчик

Get-Content Clients.txt | ForEach-Object {
Get-Item "\\$_\C$\Program Files\My Application\MyApp.ini" } |
Replace-FileString -Pattern 'Server=appserver1'
-Replacement 'Server=appserver2' -Overwrite

При попытке запуска Powershell выдает мне следующее: Replace-FileString" не распознано как имя командлета

Помогите пожалуйста понять почему?

Foreigner
11-04-2016, 12:49
SahatoshL, Потому что такой команды или функции в PowerShell нет. Это либо какой-то подгружаемый сторонний модуль, либо самописная функция или скрипт.

SahatoshL
11-04-2016, 12:53
SahatoshL, Потому что такой команды или функции в PowerShell нет. »

А почему тогда в статьях по Powershell ее активно используют? и откуда она взялась тогда здесь интересно.

Foreigner
11-04-2016, 12:54
А почему тогда в статьях по Powershell ее активно используют? »
Не знаю, впервые увидел от вас.

SahatoshL
11-04-2016, 12:57
Не знаю, впервые увидел от вас. »

а не подскажите тогда каким образом можно строчку заменить в файлике на определенных компьютепах сети?

Iska
11-04-2016, 13:03
А почему тогда в статьях по Powershell ее активно используют? и откуда она взялась тогда здесь интересно. »
Ну, например, отсюда — Replacing Strings in Files Using PowerShell | Scripting content from Windows IT Pro (http://windowsitpro.com/scripting/replacing-strings-files-using-powershell):
Because there isn't a PowerShell cmdlet that provides this functionality, I wrote Replace-FileString.ps1.
А дальше пошло-поехало растекаться по ресурсам, например:
PowerShell/Replace-FileString.ps1 at master · kevinkemp/PowerShell · GitHub (https://github.com/kevinkemp/PowerShell/blob/master/scripts/Replace-FileString.ps1)
Replace()| SS64.com (http://ss64.com/ps/replace.html)
и т.д.

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

SahatoshL
11-04-2016, 13:05
Ну, например, отсюда — Replacing Strings in Files Using PowerShell | Scripting content from Windows IT Pro: »

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

Foreigner
11-04-2016, 13:09
Попробуйте так:

Get-Content Clients.txt | ForEach-Object {

(get-content "\\$_\C$\Program Files\My Application\MyApp.ini") -replace 'Server=appserver1','Server=appserver2' |
set-content "\\$_\C$\Program Files\My Application\MyApp.ini"

}

SahatoshL
11-04-2016, 13:19
Попробуйте так:
Код:
Get-Content Clients.txt | ForEach-Object {
(get-content "\\$_\C$\Program Files\My Application\MyApp.ini") -replace 'Server=appserver1','Server=appserver2' |
set-content "\\$_\C$\Program Files\My Application\MyApp.ini"
} »

Спасибо большое! работает. коротко и ясно)

SahatoshL
14-04-2016, 06:59
Здравствуйте! я опять по тому же вопросу) точнее продолжил эту тему ) создал формочку с кнопочками и т.д. но и решил усложнить немного то что мне показали. сделал следующим образом:

$NewIP="Server=22.22.22.22"

# вытаскиваем список компов
$adress=Get-Content C:\powrsh\comps.txt

#запускаем цикл по списку станций
for ($i=0; $i -le $adress.Length; $i++)

# меняем на i-ой раб станции ip сервера
{(get-content "\\$adress[i]\C$\AutoGRAph\Setup.ini") -replace 'Server=11.11.11.11','Server=22.22.22.22' |
set-content "\\$adress[i]\C$\AutoGRAph\Setup.ini"

#сразу же проверяем заменился ли адресс
$ipCheck=Get-Content "\\$adress[i]\C$\AutoGRAph\Setup.ini"

#Запускаем цикл по файлу setup.ini
for ($j=0; $j -le $ipCheck.Length; $j++)
{if ($ipCheck[$j] -eq $NewIP)
{"на компьютере с именем"+$adress[$i]+" адрес сервера изменен на"+$NewIP
}else
{"на компьютере с именем"+$adress[$i]+" адрес сервера не изменен"
}


}

}


Но что то он изначально начал ругаться на строчку \\$adress[i]\C$\AutoGRAph\Setup.ini. Не берет он имя компа с тхт а просто так и ищет например PCname[0]. не пойму почему) подскажите пожалуйста) ну и в основном пробегите глазами а то я первый раз начал с циклами в Powershell работать)

Foreigner
14-04-2016, 08:28
SahatoshL,
1. На мой взгляд цикл for здесь лишний, можно сразу пройтись по списку циклом foreach ($i in $adress) {}.
2. Надо чтобы раскрылась переменная:

"\\$($adress[$i])\C$\AutoGRAph\Setup.ini"

SahatoshL
14-04-2016, 08:42
SahatoshL,
1. На мой взгляд цикл for здесь лишний, можно сразу пройтись по списку циклом foreach ($i in $adress) {}.
2. Надо чтобы раскрылась переменная:
Код:
"\\$($adress[$i])\C$\AutoGRAph\Setup.ini" »


Попробовал так как вы сказали :
$NewIP="Server=22.22.22.22"

# вытаскиваем список компов
$adress=Get-Content C:\powrsh\comps.txt


#запускаем цикл по списку станций
foreach($i in $adress)

# меняем на i-ой раб станции ip сервера
{(get-content "\\$adress[$i]\C$\AutoGRAph\Setup.ini") -replace 'Server=11.11.11.11','Server=22.22.22.22' |
set-content "\\$adress[$i]\C$\AutoGRAph\Setup.ini"

}

Все равно ошибка и ругается на путь. get-content : Объект для указанного пути \\khmau-w-13675-2[khmau-w-13675-2]\C$\AutoGRAph\Setup.i
ni не существует или отфильтрован с помощью параметра -Include или -Exclude.

Foreigner
14-04-2016, 08:52
SahatoshL, Пишите пожалуйста код в теге code. В редакторе есть ссылка на теги.
Не стоит бездумно смешивать мои два пункта, в цикле foreach:

$NewIP="Server=22.22.22.22"

# вытаскиваем список компов
$adress=Get-Content C:\powrsh\comps.txt


#запускаем цикл по списку станций
foreach($i in $adress)

# меняем на i-ой раб станции ip сервера
{
(get-content "\\$i\C$\AutoGRAph\Setup.ini") -replace 'Server=11.11.11.11','Server=22.22.22.22' |
set-content "\\$i\C$\AutoGRAph\Setup.ini"
}
Если будет ошибка, то попробуйте экранировать знак $ в C$, т.е. "C`$" или "C$([char]36)"

SahatoshL
14-04-2016, 09:00
SahatoshL, Пишите пожалуйста код в теге code. В редакторе есть ссылка на теги. »
Не знал, теперь впредь буду так писать.

Не стоит бездумно смешивать мои два пункта, в цикле foreach: »
Я сейчас пока пытаюсь только понять синтаксис и как тут устроено все. Да само построение кода схожее с С и С++ но для меня пока некоторые моменты не привычны) Простите уж если осквернил Powershell) Смешиваю не специально)

А второй цикл можно также впринципе организовать через Foreach пот такому же принципу как и первый? или же его можно оставить?

Foreigner
14-04-2016, 09:10
Если не ошибся:

$NewIP="Server=22.22.22.22"
$adress=Get-Content C:\powrsh\comps.txt

foreach ($i in $adress)
{
(get-content "\\$i\C$\AutoGRAph\Setup.ini") -replace 'Server=11.11.11.11',"Server=$NewIP" |
set-content "\\$i\C$\AutoGRAph\Setup.ini"

$ipCheck=Get-Content "\\$i\C$\AutoGRAph\Setup.ini"

foreach ($j in $ipCheck)
{
if ($j -eq $NewIP)
{
"на компьютере с именем " + $i + " адрес сервера изменен на " + $NewIP
}
else
{
"на компьютере с именем " + $i + " адрес сервера не изменен"
}
}}

SahatoshL
14-04-2016, 09:10
SahatoshL, Пишите пожалуйста код в теге code. В редакторе есть ссылка на теги.
Не стоит бездумно смешивать мои два пункта, в цикле foreach:
Код:
$NewIP="Server=22.22.22.22"
# вытаскиваем список компов
$adress=Get-Content C:\powrsh\comps.txt
#запускаем цикл по списку станций
foreach($i in $adress)
# меняем на i-ой раб станции ip сервера
{
(get-content "\\$i\C$\AutoGRAph\Setup.ini") -replace 'Server=11.11.11.11','Server=22.22.22.22' |
set-content "\\$i\C$\AutoGRAph\Setup.ini"
}
Если будет ошибка, то попробуйте экранировать знак $ в C$, т.е. "C`$" или "C$([char]36)" »

Работает но подскажите пожалуйста вот еще какую вещь. Во втором цикле он сравнивает все строки ini файла и на каждую строчку выдает не изменен доходя до той строчки где совпадает изменен и остальное опять не изменен. а как сделать выбор именно строчки Server=22.22.22.22. где указать то что нужно выбрать после Get-Content?

Foreigner
14-04-2016, 09:21
SahatoshL, Я бы вообще так не проверял, попробуйте такие варианты

$ipCheck=Get-Content "\\$i\C$\AutoGRAph\Setup.ini"

if ($ipCheck -match 'Server=2\.2\.2\.2') { $True }

# или

if ($ipCheck -contains 'Server=2.2.2.2') { $True }

SahatoshL
14-04-2016, 09:24
SahatoshL, Я бы вообще не так не проверял »

-match и -contains по сути одно и тоже выполняют? я так понял они построчно проверяют текст и если есть совпадения тогда true ?

Foreigner
14-04-2016, 09:28
SahatoshL, Проверяют массив либо на соответствие элемента рег.выражению, либо на наличие данного элемента массива.

SahatoshL
14-04-2016, 09:31
SahatoshL, Проверяют массив либо на соответствие элемента рег.выражению, либо на наличие данного элемента массива. »

Спасибо!




© OSzone.net 2001-2012