当我转到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
答案 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