2014-09-23 8 views
0

У меня есть .bat-файл, который выполняет список вещей без проблем. Это добраться до выполнения строки PowerShell: PowerShell.exe "Y: \ Data \ FS01 \ NoTouch_Deploy.ps1"Выполнение файла .ps1 из .bat-файла

Я получаю следующее сообщение об ошибке: ВНИМАНИЕ: Не удалось загрузить расширение по 'SQLAS': Исключение в SMO При попытке управлять сервисом. -> Не удалось получить данные для этого запроса. -> Недопустимый класс

Когда я запускаю тот же скрипт через графический интерфейс, он работает без проблем. Я также пробовал и запускал простой сценарий Powershell в том же месте (тестовый только бросает окно Windows Message, чтобы я знал, что он открывается и выполняет) это тоже работает. но как только я добавляю в обычный .ps1 и запускаю его из .bat-файла, я получаю эту ошибку. Скрипт включен ниже. Краткое описание скрипта: он устанавливает несколько переменных, создает 2 функции (BCP и logwrite для захвата ошибок) переименовывает некоторые таблицы и запускает хранимую процедуру SQL. затем выполняет функцию BCP для перемещения данных с сервера на сервер, а затем выполняет еще одну процедуру.

cls 

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
## TEST MSGBOX## [System.Windows.Forms.MessageBox]::Show("We are proceeding with next step." , "Status") 
$ErrorActionPreference = "stop" 
[Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") 
[Void][System.Reflection.Assembly]::LoadWithPartialName("System.Data") 
Add-PsSnapin sqlserverprovidersnapin100 -ErrorAction SilentlyContinue 
Add-PsSnapin sqlservercmdletsnapin100 -ErrorAction SilentlyContinue 
Import-Module SQLPs -DisableNameChecking -ErrorAction SilentlyContinue 
#Import-Module SQLAS -DisableNameChecking -ErrorAction SilentlyContinue 
Set-Location 'C:\' 
# Set Variables (Make table driven for final tool creation) 
$SourceServer = "DevServ" 
$SourceDB = "DevDB" 
$SourceObject = "DevTable" 
$TargServer = "ProdServ" 
$TargDB = "ProdDB" 
$TargObject = "ProdTable" 
$ContainerDB = 'MainDB' 

################################################################################################################ 
##          Begin Function LogWrite            ## 
##################################################################################################### ########### 
Function LogWrite() 
    { 
     Param 
      (

       [string]$LogStr, 
       [string]$Table, 
       [string]$Server, 
       [string]$DataBase 
      ) 

     Trap{continue} 
     #$DateTime = Get-Date -UFormat "%Y:%MM:%D:%H:%M:%S" 

     $LogInsQuery = "INSERT INTO dbo.Deploy_LOG ([TableName], [LOGTEXT],[DateStamp]) VALUES ('" + $Table + "', '" + $LogStr + "',getdate())" 
     Invoke-Sqlcmd -ServerInstance $SServer -Database $SDB -Query $LogInsQuery 

    } 
################################################################################################################ 
##          Begin Function BCP 
################################################################################################################ 


Function BCP() 
    { 
     Param 
      (
       [string]$SourceServer, 
       [string]$SourceDB, 
       [string]$SourceObject, 
       [string]$TargServer, 
       [string]$TargDB, 
       [string]$TargObject 
      ) 
     $NewServer 

     Try 
      { 
       $SourceCon = New-Object Data.SqlClient.SqlConnection 
       $SourceCon.ConnectionString = "Data  Source=$SourceServer;DataBase=$SourceDB;Integrated Security=True" 

       Logwrite "$TargObject -- Beginning BCP transfer process" $SourceObject 

       $TargCon = New-Object Data.SqlClient.SqlConnection 
       $TargCon.ConnectionString = "Data Source=$TargServer;DataBase=$TargDB;Integrated Security=True" 
       $TargCon.open() 

       #[long]$StartCount = (Invoke-Sqlcmd -ServerInstance $SourceServer -Query "SELECT COUNT(*) as 'Ct' FROM $TargDB.dbo.$TargObject")[0] 

       $bcp = New-Object Data.SqlClient.SqlBulkCopy($TargCon.ConnectionString, [System.Data.SqlClient.SqlBulkCopyOptions]::KeepIdentity) 

       $FieldsServer = New-Object "Microsoft.SqlServer.Management.SMO.Server" $TargServer 
       $DevServer = New-Object "Microsoft.SqlServer.Management.SMO.Server" $SourceServer 

       $SelectString = 'SELECT ' 
       $DevServer.Databases[$TargDB].Tables | ?{$_.name -eq $TargObject} | %{$_.Columns | %{$SelectString += "[$($_.name)],"}} 
       $SelectString = $SelectString.Substring(0, ($SelectString.Length - 1)) # Remove the trailing comma 
       $SelectString += " FROM dbo.$SourceObject" 

       $SourceCon.open() 
       $SqlCmd = New-Object "Data.SqlClient.SqlCommand" -ArgumentList $SelectString, $SourceCon 
       [Data.IDataReader]$DataReader = $SqlCmd.ExecuteReader() 

       $bcp.BulkCopyTimeout = 0 
       $bcp.DestinationTableName = "dbo.$TargObject" 
       $bcp.WriteToServer($DataReader) 

       $SqlCmd = $null 
       $DataReader = $null          
       $SourceCon.Close() 
       $bcp.Close() 

       $TargCon.Close() 

       LogWrite "$TargObject -- Transfer complete" $SourceObject; 
      } 
     Catch 
      { 
       LogWrite "ERROR in BCP Subroutine -- $_" $SourceObject; 
      } 

    } 

################################################################################################################ 
##          Begin main code section end of functions  
################################################################################################################ 

Try 
      { 

    $SqlQuery = "SP_Rename 'TableName','TableName_Deploy'" 
    Invoke-Sqlcmd -ServerInstance $SServer -Database $SDB -Query $SqlQuery 
    $SqlQuery ="" 

# runs the Sproc on the FLD server to make sure that the _Deploy table exists, is empty and is indexed. 
    $DeployTableSproc = "EXECUTE [dbo].[SP_NoTouch_Staging_Build]" 
    Invoke-Sqlcmd -ServerInstance $TargServer -Database $ContainerDB -Query $DeployTableSproc 

# Runs the BCP process to copy the records to the Feild into the new prepared table. 
BCP $SServer $SDB $SourceObject $TargServer $TargDB $TargObject 


    $SqlQuery = "EXECUTE [MainDB].[dbo].[Notify_NoTouch] @EmailType = 6" 
    Invoke-Sqlcmd -ServerInstance $SServer -Database $SDB -Query $SqlQuery 
    $SqlQuery ="" 


LogWrite "No touch table transfer complete Table renamed and indexed" $SourceObject; 

      } 
     Catch 
      { 
       LogWrite "ERROR in Transfer process" $SourceObject; 
      } 

Я пытался добавить # Import-Module SQLAS -DisableNameChecking -ErrorAction SilentlyContinue Это не помогло. есть идеи? Спасибо

+0

Добавление '# Import-Module' ничего не делало, потому что' # 'указывает, что все, что следует за ним, является комментарием - оно никогда не будет выполнено. Но под v3 и новее это не важно, потому что модули автоматически импортируются, если это необходимо. – alroc

+0

Я прокомментировал это после того, как я запустил его, и он ничего не сделал. Извините, я оставил его комментарий, когда я вставил его здесь. Я думаю, что я все еще на V2 –

+0

Как работает командный файл? Вы запускаете его вручную или это запланированная задача может работать под другой учетной записью? Как вы запускаете скрипт вручную за пределами командного файла через ISE или консоль? Вы автоматически загружаете вещи в свой профиль ISE, которые не загружаются для консоли? – TheMadTechnician

ответ

1

Поскольку вы в конечном счете хотите запустить этот скрипт через планировщик задач, я бы пошел и создаст задачу на сервере, на котором вы хотите. На вкладке Actions, просто установите следующие критерии:

поле Программа/скрипт

C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe 

Добавить поле Аргументы:

-NoProfile -ExecutionPolicy unrestricted -nologo -command "&{\\path\to\your\files\FileName.ps1 -Silent:$true}" 

Если вы хотите, чтобы проверить это с партией файл, просто введите код:

schtasks /RUN /s "ServerName" /TN "Scheduled Tasks Named" | Out-String 
Смежные вопросы