路径SQLSERVER:\ 7za.exe不存在?

时间:2014-11-18 19:03:26

标签: powershell

我在powershell脚本中有以下代码。我在文件的同一目录中有7za.exe个文件。

param($sql)
$temp = [System.IO.Path]::GetTempFileName()
Invoke-Sqlcmd -ServerInstance sqlserver1 $sql | ConvertTo-Csv > $temp
.\7za.exe a '$temp.zip' '$temp'

然而,它出现以下错误。在invoke-sqlcmd之后立即在同一文件夹中执行可执行文件的正确方法是什么?

SQL Server PowerShell provider error: Path SQLSERVER:\7za.exe does not exist. Please specify a valid path.
    + CategoryInfo          : OperationStopped: (:) [], GenericProviderException
    + FullyQualifiedErrorId : Microsoft.SqlServer.Management.PowerShell.GenericProviderException
    + PSComputerName        : localhost

2 个答案:

答案 0 :(得分:2)

如果查看错误消息中的路径,它是“SQLSERVER:\ 7za.exe” - 所以运行此脚本的PowerShell实例的当前工作目录(可以使用自动变量$ pwd获取) )是SQLSERVER:\,它是由SQL模块\ snap-in创建的PSDrive,必须加载它才能运行Invoke-SqlCmd cmdlet。

默认情况下,PowerShell脚本不会将其当前位置用作当前工作目录。但是,在PowerShell版本3及更高版本中,您可以使用自动变量$ PSScriptRoot获取脚本的目录。在早期版本中,您可以使用以下命令自行生成$ PSScriptRoot:

$PSScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition

然后您可以在脚本中使用此变量,如下所示:

& (Join-Path $PSScriptRoot '7za.exe') "$temp.zip" "$temp"

请注意,我在$ temp变量周围使用了双引号,因此PowerShell会自动将变量扩展为正确的名称。

答案 1 :(得分:1)

@jbsmith关于使用什么路径是正确的。导致此问题的原因是SQLPS模块将当前目录更改为SQLSERVER:导入时。