2016-09-19 185 views
2

我有一个PowerShell脚本,它将递归循环一个dir和subdir,并在其中运行所有SQL文件,并将执行记录在.log文件中1表示成功,1表示异常。 PowerShell脚本做什么它应该做的事,但在cmd窗口,我看到这个错误:Get-Content -raw参数错误

​​

从该行

$query = Get-Content -Path $_.FullName -Raw 

这个语句一个循环中运行,每次迭代所以FullName变化。这是我使用的版本。

Name    : Windows PowerShell ISE Host 
Version   : 5.0.10586.117

示例脚本低于:

Get-ChildItem $ScriptFolder -Recurse -Exclude "*Archive*" -Filter *.sql | 
    sort Directory | 
    ForEach-Object { 
    $query = Get-Content -Path $_.FullName -Raw 
    $result = SQLCMD -S $FullDBServer -E -I -Q $query -d $Database 

有什么想法?

回答

2

您正在使用PowerShell v2或更早版本。 PowerShell v3引入了参数-Raw。无论是升级的PowerShell或管Get-Content输出通过Out-String

$query = Get-Content -Path $_.FullName | Out-String 

你也应该能够直接与sqlcmd运行文件(即没有阅读其内容和传递,为命令):

$result = SQLCMD -S $FullDBServer -E -I -i $_.FullName -d $Database 
+0

刚刚接触powershell。在你的语法中,-I和-I是否表示2 diff cmds?在调试过程中,我偶然发现了另一个问题。 Sqlcmd:错误:在命令'go'附近的第54行出现语法错误。 + $ result = SQLCMD -S $ FullDBServer -E -I -Q $查询-d $数据库 我可以感觉到问题是从我正在运行的脚本执行cmd。为什么相同的脚本在SSMS中工作得很好而在PowerShell中失败?我了解到,powershell默认关闭带引号的标识符设置,你必须明确地打开它(-I)。同样的方式有一些开关,我需要使用PowerShell不错误“去”? – Sri

+0

我链接到解释'sqlcmd',它的参数和你观察到的行为的文档。我不会把它读给你。 –

+0

我的不好。没有注意到它。谢谢 – Sri

2

在PS3中引入了-Raw参数Get-Content

要获得一个字符串中的文件内容,有几种方法。

  • ,在任何PS版的工作原理的最快方法:
    $text = [IO.File]::ReadAllText('c:\path\file.ext')
  • 的2倍慢方法PS3 +:
    $text = Get-Content 'c:\path\file.ext' -Raw
  • 的100倍慢PS2兼容的替代:
    $text = Get-Content 'c:\path\file.ext' | Out-String
  • 比PS2兼容替代方案慢30倍:
    $text = Get-Content 'c:\path\file.ext' -ReadCount 1000 | Out-String
0

我在ps v 5中遇到过此错误,当-path参数实际上不是路径时。

尝试添加Write-Host $_.fullname以上的行抛出的错误,以确保$_.fullname实际上是你认为它是。