2016-09-19 4 views
2

У меня есть сценарий PowerShell, который будет рекурсивно цитировать dir и subdir и запускать все файлы SQL внутри него и регистрировать выполнение в файлах .log 1 для успеха и 1 для исключений. Сценарий PowerShell делает то, что его должен делать, но в CMD окно, я вижу эту ошибку:Ошибка Get-Content -Raw

Get-Content : A parameter cannot be found that matches parameter name '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. Либо обновить 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: Ошибка: ошибка синтаксиса в строке 54 рядом с командой «go». + $ result = SQLCMD -S $ FullDBServer -E -I -Q $ query -d $ Database Я могу понять, что проблема связана с go cmd из сценария, который я запускаю. Почему один и тот же скрипт отлично работает в SSMS и не работает в powershell? Я узнал, что powershell отключает параметр цитируемого идентификатора по умолчанию, и вы должны явно его включить (-I). Точно так же есть какой-то переключатель, который мне нужно использовать для powershell, чтобы не ошибка «Go»? – Sri

+0

Я связался с документацией, объясняющей 'sqlcmd', ее параметрами и наблюдаемым поведением. Я не буду читать его вам. –

+0

мой плохой. Не заметил. Спасибо – Sri

2

Параметр -RawGet-Content был представлен в PS3.

Чтобы получить содержимое файла в одной строке, существует несколько методов.

  • Самый быстрый метод, который работает в любой версии 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
  • В 30 раз более медленная альтернатива PS2:
    $text = Get-Content 'c:\path\file.ext' -ReadCount 1000 | Out-String
0

Я испытал эту ошибку в ps v 5, когда параметр -path не был фактически путём.

Попробуйте добавить Write-Host $_.fullname над строкой, указав ошибку, чтобы убедиться, что $_.fullname на самом деле то, что вы думаете.

Смежные вопросы