Для цикла для PowerShell

Прямо из документации для BeautifulSoup , вы можете легко скрыть комментарии (или что угодно) с помощью extract():

from BeautifulSoup import BeautifulSoup, Comment
soup = BeautifulSoup("""1
                        23""")
comments = soup.findAll(text=lambda text:isinstance(text, Comment))
[comment.extract() for comment in comments]
print soup
# 1
# 23

-1
задан Ansgar Wiechers 13 July 2018 в 09:42
поделиться

2 ответа

Я вижу пару проблем с вашим кодом PowerShell:

  • Set-Location не возвращает никакого вывода, поэтому переменная $database пуста.
  • foreach ($database in $database) Вы используете ту же переменную, что должен удерживать список баз данных как переменную цикла. Используйте переменную как переменную цикла. Кроме того, поскольку $database пуст (см. Выше), PowerShell просто пропустит цикл.
  • Вам нужно извлечь имена базы данных из вывода psql, иначе вы получите всю строку (включая информацию о владельце, кодировке и т. д.).
  • «Магический оператор» --% останавливает PowerShell от разбора остальной части командной строки, поэтому ваша переменная $database в имени выходного файла не будет
  • Вы не указали имя базы данных в командной строке pg_dump.

Измените код на что-то вроде этого:

Set-Location 'E:\Exxellence\PostgreSQL\9.5\bin'
$databases = (.\psql -U postgres -l) -match '^ \S' | ForEach-Object {
    ($_ -split '\s+\|\s+')[0].Trim()
} | Where-Object {
    $_ -match '^(beheer|forms|loket|kcs|mo|alfresco)$'
}

foreach ($db in $databases) {
    .\pg_dump -h localhost -p 5432 -U postgres -F c -b -f "${db}.backup" $db
}

или вот так:

Set-Location 'E:\Exxellence\PostgreSQL\9.5\bin'
(.\psql -U postgres -l) -match '^ \S' | ForEach-Object {
    ($_ -split '\s+\|\s+')[0].Trim()
} | Where-Object {
    $_ -match '^(beheer|forms|loket|kcs|mo|alfresco)$'
} | ForEach-Object {
    .\pg_dump -h localhost -p 5432 -U postgres -F c -b -f "${_}.backup" $_
}

, и он должен делать то, что вы хотите.

Примечание. Фильтр для имен базы данных предполагает, что это точные имена. Если это только частичные имена, измените строку на $_ -match 'beheer|forms|loket|kcs|mo|alfresco'.

1
ответ дан Ansgar Wiechers 17 August 2018 в 13:22
поделиться
  • 1
    Вы, очевидно, знаете PostgreSQL лучше меня, иначе мы уточняем ответы от ввода другого. Не попытались бы ли интерпретировать параметры .\pg_dump? – LotPings 13 July 2018 в 10:29
  • 2
    Спасибо за вашу реакцию! результат. \ psql - ничто ?, ваш 3-й пункт именно то, что мне нужно, только имена базы данных из вывода psql – Glen Hams 13 July 2018 в 10:36
  • 3
    @LotPings pg_dump - это внешняя команда, поэтому я бы не ожидал, что PowerShell будет работать с такими простыми аргументами. Но я был удивлен раньше. ^ _ ^; Тем не менее, это было бы моим первым взятием на экспорт, и я бы уточнил его, если бы на самом деле возникла ошибка. – Ansgar Wiechers 13 July 2018 в 10:36
  • 4
    @AnsgarWiechers для редактирования! но результат все равно ничего, может быть, что-то не так с ($ _ -split '\ s + | \ s +') [0] .Trim () ?? я понятия не имею, что это делает: P – Glen Hams 13 July 2018 в 10:50
  • 5
    Я не знаю выход sql, но если | предполагается буквальным, его нужно экранировать с помощью обратного слэша '\s+\|\s+', в противном случае это альтернативный OR – LotPings 13 July 2018 в 10:57

Первый выпуск с вашим кодом PowerShell находится в цикле foreach. Попробуйте следующее:

ForEach ($database in $databases)

И измените имя переменной $ databases (1-я строка).

0
ответ дан Marcin Mirzyński 17 August 2018 в 13:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: