Хранить имя хоста в переменной - PullRequest
0 голосов
/ 29 августа 2018

Когда я иду в PowerShell и набираю там:

PS> Hostname

Я получаю имя текущей машины - это нормально (имя: my_host) У меня вопрос, как я могу сохранить это значение в переменной?

У меня есть этот запрос (резервная БД):

$query = "BACKUP DATABASE [my_db] TO  DISK = N'\\${Hostname}\Backup\test\DB\my_db.bak' WITH NOFORMAT, NOINIT,  NAME = N'my_db Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION"

Как видите, я вставил туда переменную $Hostname, но она так не работает.

Как я уже говорил, мое имя хоста - my_host, так что это ожидаемый результат:

$query = "BACKUP DATABASE [my_db] TO  DISK = N'\\my_host\Backup\test\DB\my_db.bak' WITH NOFORMAT, NOINIT,  NAME = N'my_db Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION"

Как я могу это сделать?

Кстати, я знаю, что это не работает, потому что, когда я запускаю эту команду, она терпит неудачу:

Invoke-Sqlcmd -Username user -Password 12345 -ErrorAction Stop -ServerInstance my-db-server -Database master -Query ${query} -QueryTimeout 0 -OutputSqlErrors 1

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

В Windows вы можете использовать собственную переменную окружения PowerShell $env:COMPUTERNAME. Итак, один из способов:

$query ="BACKUP DATABASE [my_db] TO  DISK = N'\\${$env:COMPUTERNAME}\Backup\test\DB\my_db.bak' WITH NOFORMAT, NOINIT,  NAME = N'my_db Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION"

Sidenote - -Query ${query} можно упростить до -Query $query. Фигурные скобки имеют смысл, если в противном случае вы ссылаетесь на неверную переменную. Пример ниже.

$a = "Easy as "
Write-Host "$aabc"    # looks for variable $aabc
Write-Host "${a}abc"  # looks for variable $a, then prints abc
0 голосов
/ 29 августа 2018

hostname на самом деле hostname.exe, то есть это не собственная команда, которая интерпретируется оболочкой, а внешняя команда, которая вызывается.

Вы можете назначить вывод переменной как обычно:

$hostname = hostname.exe

Затем вы можете построить строку запроса следующим образом

$query ="BACKUP DATABASE [my_db] TO  DISK = N'\\$hostname\Backup\test\DB\my_db.bak' WITH NOFORMAT, NOINIT,  NAME = N'my_db Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION"

или с оператором -f

$query = "BACKUP DATABASE [my_db] TO  DISK = N'\\{0}\Backup\test\DB\my_db.bak' WITH NOFORMAT, NOINIT,  NAME = N'my_db Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION" -f $Hostname

Если вы хотите использовать hostname.exe без вспомогательной переменной, вы можете использовать подвыражение $().

$query = "BACKUP DATABASE [my_db] TO  DISK = N'\\$(hostname.exe)\Backup\test\DB\my_db.bak' WITH NOFORMAT, NOINIT,  NAME = N'my_db Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION"

Ваш пример с ${hostname} равен $hostname, который является пустой переменной и не вызывает hostname.exe.

Однако существуют различные способы получения имени хоста без вызова внешней команды, например:

Переменная среды: $env:COMPUTERNAME

WMI Класс: Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object -ExpandProperty Name

Вы можете использовать оба примера, как показано ранее.

0 голосов
/ 29 августа 2018

Вы можете использовать команду Hostname в своей переменной с синтаксисом $ (Hostname). Ваша команда будет работать так, как вы ожидаете, в следующем формате:

$query ="BACKUP DATABASE [my_db] TO  DISK = N'\\$(Hostname)\Backup\test\DB\my_db.bak' WITH NOFORMAT, NOINIT,  NAME = N'my_db Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...