PSCP не может извлечь из массива ip в FOR l oop, но работает в FOREACH? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть скрипт powershell, поэтому в основном мне нужно перенести файлы из нескольких источников в один локальный. Я не хочу использовать pslurp в этом случае.

По сути, я получаю более одного удаленного источника ... ошибка, если я запускаю свой массив для l oop, однако он работает для каждого почему ?

Теперь проблема в том, что я не могу изменить свой путь назначения, так как я не знаю, где разрешить запуск моего массива назначения в foreach l oop. Если я укажу один исходный ip, он может l oop отправить в diff назначение. Так что мой массив и l oop технически работают нормально.

Общий код (не работает, получено больше, чем один удаленный источник не поддерживается ошибка)

$ArrayIP=@("root@10.0.0.1","root@10.0.0.2")
$ArrayDestination=@("C:/Users/me/save01","C:/Users/me/save01"}

for (i=0; i -le2; i++){
pscp -pw testing -r $ArrayIP[i]":"/cf/conf/backup/* $ArrayDestination[i]
}

Итак, я перешел на FOREACH ... но теперь я не знаю, как разрешить его сохранение в другом месте назначения? В любом случае я указал одно единственное место назначения для тестирования, и оно работает. Я больше не получаю более одной ошибки удаленного источника.

foreach ($IP in $ArrayIP){
pscp -pw testing -r $IP":"/cf/conf/backup/* <insert destination? dk how to make it run an arrayDestination>
}

Теперь я думаю, стоит ли мне делать двумерный массив ... это поможет мне запустить разные переменные в foreach l oop ? Или, если кто-то может направить меня с помощью команды объекта ... Я прочитал об этом на форумах, но все еще не уверен, как ее использовать

Ответы [ 3 ]

0 голосов
/ 03 марта 2020

Вы можете попробовать это, соединить путь назначения и IP со строковым значением, которое не будет конфликтовать с именем файла, и разделить на это значение внутри l oop.

$Array=@("root@10.0.0.1--C:/Users/me/save01","root@10.0.0.2--C:/Users/me/save01")

foreach ($Entry in $ArrayIP){
    $Split = $Entry -split '--'
    pscp -pw testing -r ($Split[0] + ':/cf/conf/backup/*') $Split[1]
}
0 голосов
/ 03 марта 2020

Первый раз, используя Powershell? Это близко к первому примеру. Использование @ () для создания массивов - миф, к которому влюбляются многие люди. Мне нравится использовать одинарные кавычки, если внутри нет переменной.

$ArrayIP = 'root@10.0.0.1', 'root@10.0.0.2'
$ArrayDestination = 'C:/Users/me/save01', 'C:/Users/me/save01'

for ($i=0; $i -lt 2; $i++){
  pscp -pw testing -r ($ArrayIP[$i] + ':/cf/conf/backup/*') $ArrayDestination[$i]
}

Я проверил строку с pscp, как это, чтобы убедиться, что я правильно понял строки. Используя другие методы, я получил лишние пробелы между ними.

for ($i=0; $i -lt 2; $i++){
  cmd /c echo pscp -pw testing -r ($ArrayIP[$i] + ':/cf/conf/backup/*') $ArrayDestination[$i]
}

pscp -pw testing -r root@10.0.0.1:/cf/conf/backup/* C:/Users/me/save01
pscp -pw testing -r root@10.0.0.2:/cf/conf/backup/* C:/Users/me/save01

Вот кое-что более интересное с массивом хэшей. Или вы можете импортировать CSV.

$hashes = @{source='root@10.0.0.1:/cf/conf/backup/*'; destination='C:/Users/me/save01'},
          @{source='root@10.0.0.2:/cf/conf/backup/*'; destination='C:/Users/me/save01'}

foreach ($item in $hashes) {
  pscp -pw testing -r $item.source $item.destination
}

0 голосов
/ 03 марта 2020

Существуют две вещи, препятствующие работе вашего первого образца:

Прежде всего, ваш текущий for l oop недопустим - имена переменных в PowerShell имеют префикс $:

for ($i=0; $i -le 2; $i++){
   ...
}

Во-вторых, PowerShell обрабатывает аргументы командной строки как расширяемые строки, и операция индекса массива не будет правильно расширяться в строке - заключите в подвыражение $() для правильного расширения индекса ссылочного массива:

for ($i=0; $i -le 2; $i++){
    pscp -pw testing -r "$($ArrayIP[$i]):/cf/conf/backup/*" "$($ArrayDestination[$i])"
}
...