将主机名存储在变量中

时间:2018-08-29 16:39:47

标签: powershell

当我转到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 :(得分:2)

您可以在语法为$(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"

答案 1 :(得分:2)

hostname实际上是hostname.exe,即不是Shell解释的本机命令,而是被调用的外部命令。

您可以照常将输出分配给变量:

$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

您可以使用前面显示的两个示例。

答案 2 :(得分:0)

在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"

边注--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