2016-09-19 5 views
2

私は、dirとsubdirを再帰的にループし、その内部にあるすべてのSQLファイルを実行し、成功のために.logファイルに実行を記録し、例外のために1つをログに記録するPowerShellスクリプトを持っています。 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以前を使用しています。パラメーター-RawはPowerShell v3で導入されました。どちらのOut-String経由のPowerShellまたはパイプにGet-Contentの出力をアップグレード:

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

あなたはまた、(それらの内容を読み取り、そのコマンドに渡さずにIE)sqlcmdで直接ファイルを実行することができます:

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

新しいpowershellです。あなたの構文では、-Iと-Iは2つのdiff cmdsを表しますか?私はこれをデバッグしている間に別の問題につまずいた。 Sqlcmd:エラー:54行目のコマンド 'go'の近くに構文エラーがあります。 + $ result = SQLCMD -S $ FullDBServer -E -I -Q $ query -d $ Database 問題は私が実行しているスクリプトからgo cmdを使っていることがわかります。同じスクリプトがSSMSでうまく動作し、PowerShellで失敗するのはなぜですか?私はpowershellがデフォルトでquoted identifierの設定を無効にしていることを学びました。明示的にそれをオンにする必要があります(-I)。同じ方法で、私がPowerShellに "Go"のエラーを出さないために使う必要のあるスイッチがありますか? – Sri

+0

'sqlcmd'とそのパラメータ、そしてあなたが観察した振る舞いを説明しているドキュメントにリンクしました。私はあなたにそれを読むつもりはない。 –

+0

私の悪い。それに気付かなかった。ありがとう – Sri

2

-RawパラメータがGet-ContentであるものをPS3に導入した。

ファイルの内容を1つの文字列で取得するには、いくつかの方法があります。

  • 任意のPS版で動作最速の方法:
    $text = Get-Content 'c:\path\file.ext' -Raw
  • 100倍遅いPS2互換代替:
    $text = Get-Content 'c:\path\file.ext' | Out-String PS3 +ため

    $text = [IO.File]::ReadAllText('c:\path\file.ext')
  • 2倍遅い方法
  • 30倍遅いPS2互換の代替:
    $text = Get-Content 'c:\path\file.ext' -ReadCount 1000 | Out-String
0

-pathパラメータは、実際にパスしなかったとき、私は、PS V 5でこのエラーを経験してきました。

エラーを投げる行の上にWrite-Host $_.fullnameを追加して、実際に$_.fullnameと思っていることを確認してください。

関連する問題