модификатор объема

веденном ниже коде я использовал$scripts переменная для перебораforeach петля внутриInvoke-Command заявление. Но$script значения не заменяются должным образом, и результат выглядит как одна строка как "count.sql size.sql".foreach цикл выполняется правильно, если он определен внеInvoke-Command петля.

Есть ли конкретный способ определитьforeach петля внутриInvoke-Command?

$scripts = @("count.sql", "size.sql")
$user = ""
$Password = ""
$SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $User, $SecurePassword

foreach ($server in $servers) {
    Invoke-Command -ComputerName $Server -Credential $cred -ScriptBlock {
        Param($server, $InputFile, $scripts, $url)

        foreach ($script in $scripts) {
            echo "$script"
    } -ArgumentList "$server,"$scripts","$url"
}
 andyb06 сент. 2017 г., 05:38
-argumentList Параметр также выглядит неправильно размещенным. В настоящее время он находится внутри блока скрипта.
 ArcSet06 сент. 2017 г., 05:34
поскольку ваше редактирование выглядит так, как будто ваш список аргументов неверен. Вы объявляете все ваши файлы как строковые, используя "вокруг них". Измените список аргументов на -ArgumentList $ server, $ scripts, $ url. Также вы не объявляете все arugments по порядку .... Server, Inputfile, Scripts, URL. В настоящее время $ Scripts is = to $ inputfile
 Ansgar Wiechers06 сент. 2017 г., 11:23
Совершенно очевидно, что код, который вы разместили, не мог быть успешно выполнен. вложенныйforeach В цикле отсутствует закрывающая фигурная скобка, и первый аргумент-ArgumentList В параметре отсутствует закрывающая двойная кавычка.
 ArcSet06 сент. 2017 г., 05:28
этот скрипт не выглядит завершенным. Вы, кажется, неправильно вызываете varables на сервере
 workholic06 сент. 2017 г., 05:54
Похоже, проблема заключается в двойных кавычках в ArgumentList .., он работал нормально после удаления qoutes. Спасибо за ответ :) Можем ли мы определить новые переменные внутри блока скрипта invoke-command? Если я определяю, то это показывает ошибку, поскольку param () не распознается. Как я могу определить новую переменную внутри блока invoke-command?

Ответы на вопрос(1)

Решение Вопроса

что синтаксические ошибки в вашем коде являются просто опечатками в вашем вопросе и не присутствуют в вашем реальном коде.

Проблема, которую вы описываете, не имеет ничего общего с вложеннойforeach петля. Это вызвано двойными кавычками, которые вы помещаете в аргументы, передаваемые вызываемому блоку скриптов. Помещение массива в двойные кавычки превращает массив в строку со строковыми представлениями значений из массива, разделенных символомразделитель выходного поля определяется в автоматической переменной$OFS (по умолчанию пробел). Чтобы избежать такого поведения, не помещайте переменные в двойные кавычки, когда в этом нет необходимости.

ИзменитьInvoke-Command Скажите что-то вроде этого:

Invoke-Command -ComputerName $Server -Credential $cred -ScriptBlock {
    Param($server, $scripts, $url)
    ...
} -ArgumentList $server, $scripts, $url

и проблема исчезнет.

В качестве альтернативы вы можете использовать переменные вне блока скриптов черезusing модификатор объема:

Invoke-Command -ComputerName $Server -Credential $cred -ScriptBlock {
    foreach ($script in 
Invoke-Command -ComputerName $Server -Credential $cred -ScriptBlock {
    foreach ($script in $<b>using:</b>scripts) {
        echo "$script"
    }
}
lt;b>using:</b>scripts) { echo "$script" } }

Ваш ответ на вопрос