Arquivo da categoria ‘PowerShell’

Olá pessoal,

Dica rápida sobre PowerShell.

Ao tentar executar um script PowerShell dentro de um step, do tipo PowerShell, de um job no SQL Server o seguinte erro era exibido:

“The corresponding line is ‘$space.ForegroundColor = $host.ui.rawui.ForegroundColor’. Correct the script and reschedule the job. The error information returned by PowerShell is: ‘Exception setting "ForegroundColor": "Cannot convert null to type "System.ConsoleColor" due to invalid enumeration values. Specify one of the following enumeration values and try again. The possible enumeration values are "Black, DarkBlue, DarkGreen, DarkCyan, DarkRed, DarkMagenta, DarkYellow, Gray, DarkGray, Blue, Green, Cyan, Red, Magenta, Yellow, White"."  ‘.  Process Exit Code -1.  The step failed.”

Este erro ocorre quando no script você usa o comando CLS ( Clear-Host ), visto que, não há tela para “limpar”.

Remova o comando CLS e o job será executado com sucesso.

Abraço,

Demétrio Silva

aOlá pessoal, a dica de hoje surgiu através de uma comversa com o amigo Fabrício Lima em como exportar resultados de um Pipeline PowerShell para uma tabela no SQL Server. Como o assunto "gravar em tabela" é muito solicitado eu resolvi criar um artigo explicando algumas formas.

Existem diversas formas de importar e exportar dados em tabelas através do PowerShell, porém, a grande maioria não grava diretamente do Pipeline. Nos exemplos abaixo vou citar os mais conhecidos e citar o uso de cada um.

É possível criar pacotes de funções de diversas maneiras e, por questões de simplicidade, deixarei todas as funções em um arquivo chamado Funcoes.ps1. Para os exemplos abaixo o arquivo está em c:\temp\Funcoes.ps1, você pode baixar o arquivo aqui. Este arquivo servirá como nosso reporitório de Funções, logo, todas as funçõe ficarão nele e faremos apenas a referência ao mesmo dentro da console PowerShell. Para referenciar o arquivo basta colar o código abaixo no PowerGui, PowerShell Console ou PowerShell ISE. A idéia é bem parecida com o import do C# e Java. Basta colocar o código abaixo no início de qualquer chamada:

. c:\temp\Funcoes.ps1 #Atenção que o "." É obrigatório e com espaço.

Para os exemplos abaixo eu usei o PowerGUI que pode ser obtido gratuitamente aqui.

Invoke-SqlCmd2

http://gallery.technet.microsoft.com/ScriptCenter/en-us/7985b7ef-ed89-4dfd-b02a-433cc4e30894

A partir do SQL Server 2008 a Microsoft disponibilida um cmdlet chamado Invoke-SqlCmd, porém, apenas nos PCs onde o sqlps está instalado. Para não criar dependências de instalação ( ou referências de snap-ins ) aconselho o uso da Invoke-SqlCmd2.

Esta função permite exportar dados do SQL Server. Ela pode retornar um DataSet, DataTable ou DataRow.

Vejamos um exemplo do seu uso:

#Dentro do PowerGUI execute o todo o código abaixo de uma vez

cls
#Código necessário para importar o arquivo de funções
. c:\temp\Funcoes.ps1

#Neste primeiro exemplo nós realizamos uma consulta na tabela clientes da base Northwind-PTBR.
#O resultado é retornado como um array de DataRows
#É possível usar um foreach para ler todos os dados
#Para nosso exemplo simplesmente estou mostrando a primeira linha $dt[0]
$dt = Invoke-Sqlcmd2 -ServerInstance "palestras2014" -Database "Northwind-PTBR" -Query "Select * from clientes"
$dt[0]

#No segundo exemplo realizaremos a exportação dos dados para o formato CSV usando o cmdlet Export-Csv, que é nativo do PowerShell
Invoke-Sqlcmd2 -ServerInstance "palestras2014" -Database "Northwind-PTBR" -Query "Select * from clientes" | Export-Csv -LiteralPath "c:\temp\clientes_invoke.txt"

Veja o arquivo de saída abaixo:



Write-DataTable

https://gallery.technet.microsoft.com/scriptcenter/2fdeaf8d-b164-411c-9483-99413d6053ae

Como o próprio nome diz, esta function usa a classe Data.SqlClient.SqlBulkCopy para importar ( salvar ) um DataTable in memory para uma tabela no SQL Server, logo, será preciso passar um DataTable para a funcão. Sendo assim, ele não funciona no pipeline.

Vejamos um exemplo de uso:

Iremos importar dados de um TXT/CSV que possui a seguinte estrutura:

O arquivo que será usado na importação está em c:\temp\clientes.txt

Como o Write-DataTable não cria a tabela então, precisamos criá-la antes de executar o script PowerShell. Para isso, execute o código abaixo para criar a tabela de destino no SQL Server Management Studio:

use tempdb --Troque pela base de destino desejada
go
CREATE TABLE clientes_writedatatable(
nome varchar(20),
idade char(2),
sexo char(1)
)

O código abaixo realiza a importação dos dados do CSV para o SQL Server:

#Dentro do PowerGUI execute o todo o código abaixo de uma vez

cls
#Código necessário para importar o arquivo de funções
. c:\temp\Funcoes.ps1

#Neste exemplo nós iremos mostrar como importar dados de um arquivo texto para dentro de uma tabela do SQL Server
#O comando abaixo importa os dados de um CSV e os transforma em um Array. O parâmetro header indica o nome das colunas que você deseja definir.
#A função Write-DataTable recebe um DataTable como parâmetro, por isso usamos a função Out-DataTable para transformar o Array do Import-CSV em um DataTable

$dt = Import-Csv c:\temp\clientes.txt -Header nome,idade,sexo -Delimiter "," | Out-DataTable

#Por fim, executamos o Write-DataTable passando o DataTable como parâmetro para ser salvo na tabela criada anteriormente

Write-DataTable -ServerInstance "palestras2014" -Database "tempdb" -TableName "clientes_writedatatable" -Data $dt

Abaixo é possível visualizar os dados importados:



Out-SQL

http://blogs.technet.com/b/sqlthoughts/archive/2008/10/03/out-sql-powershell-function-export-pipeline-to-a-new-sql-server-table.aspx

Esta função, criado por Alexey, permite salvar dados do Pipeline diretamente para o SQL Server. Eu fiz algumas mudanças na função para que a mesma possa dar suporte a cadeias de texto longas e nomes de colunas com espaço e acentos.

Basicamente você usa esta função no pipeline de qualquer cmdlet e direciona a saída do pipeline para uma tabela no SQL Server. A tabela é criada de forma automática. Segue exemplo abaixo:

cls
#Dentro do PowerGUI execute o todo o código abaixo de uma vez

cls
#Código necessário para importar o arquivo de funções
. c:\temp\Funcoes.ps1

#get-eventlog lê o log de eventos do Windows, neste caso apenas o application
#out-sql direciona a saída para uma tabela no SQL Server. Caso a tabela não exista o comando cria automaticamente.
#O parâmetro $RowId permite especificar um nome de coluna que será criado como Identity(1,1)
get-eventlog application -after (get-date).addDays(-1) | where-object {$_.EntryType -eq "error" -and $_.source -ne "DOCM"} |
out-sql -sqlserver "palestras2014" -database "tempdb" -table "tbl_EventLog" -dropexisting $true

E o resultado:

Bom pessoal, com isso finalizamos nosso artigo. Espero que seja útil.

Ficou interessado e quer aprender mais sobre PowerShell?

Entre em contato para informações sobre os cursos que ministramos abaixo:

1 – Administrando o Windows com Powershell

2 – Administrando o SQL Server com Powershell

demetrioi@hotmail.com

Abraço,

Demétrio Silva

Olá pessoal,

Estes dias um amigo estava procurando um script para listar os jobs de várias instâncias SQL Server em apenas uma execução.

O script criado por Ítalo e Eu, em PowerShell, permite listar os Jobs de várias instâncias e também mostra os detalhes do mesmo, em especial, agendamentos.

O segundo script gera um script em .sql para cada job de cada instância.

Script para gerar detalhes dos Jobs pode ser encontrado aqui.

Script para gerar script dos Jobs pode ser encontrado aqui

Abraço,

Demétrio Silva

Este erro é bem claro. A mensagem diz que o PowerGui ( ou console PowerShell ) está rodando scripts usando o .NET 4.0, que não é suportado pelo SharePoint 2010.

Para resolver o problema iremos alterar um arquivo de configuração do PowerGui para executar o suportado pelo SharePoint 2010:

1 – Abrir a pasta C:\Program Files (x86)\PowerGUI\;

2 – Abrir o arquivo ScriptEditor.exe.config;

O arquivo deve ter algo parecido com isso:

<startup useLegacyV2RuntimeActivationPolicy=”true”>
<supportedRuntime version=”v4.0″ sku=”.NETFramework,Version=v4.0″ />
<supportedRuntime version=”v2.0.50727″ />
</startup>

Devemos excluir a referência ao V4.0 conforme abaixo:

<startup useLegacyV2RuntimeActivationPolicy=”true”>
<supportedRuntime version=”v2.0.50727″ />
</startup>

Abra o PowerGui novamente e pronto!

Abraço,

Demétrio Silva

É com prazer que comunico que serei palestrante do SQLSat 147 ( organizado pela PASS ) Recife.

Segue mais informações:

“A 147ª edição do evento acontecerá nos dias 24 e 25 de agosto18 de Julho de 2012 às 16:36

O Centro de Informática (CIn) da UPFE sediará, nos dias 24 e 25 de agosto, a edição de número 147 do evento internacional SQL Saturday, que tem sua programação de palestras ligadas ao SQL Server, o banco de dados da Microsoft, e é todo voltado para a comunidade e feito por voluntários. O formato é definido e estruturado por uma organização de usuários de SQL Server, o PASS (Professional Association of SQL Server). Esta é a terceira vez que o aporta no Brasil. As primeiras edições foram em São Paulo e no Rio de Janeiro.

Todos os sábados ocorrem ao redor do mundo diversos SQL Saturdays e o evento em Recife terá uma novidade: mini-cursos na sexta-feira e um formato inovador de palestras no sábado. “A ideia é de um evento feito pela comunidade e para a comunidade, e o CIn/UFPE é o ambiente perfeito para a rica troca de conhecimentos técnicos fomentada pelos participantes”, comenta Fábio Ávila, organizador do evento em Recife.

Os mini-cursos programados para a sexta-feira (24) são “SQL Server 2012 in a highly available world”, com Denny Cherry, SQL Server MVP e MCM, e “Novidades de BI no SQL Server 2012”, ministrados por uma trinca de MVP’s: Diego Nogare, Roberval Ranches e Marcondes Alexandre. Cada mini-curso terá 8 horas de duração total e capacidade máxima de 40 participantes.

No sábado (25), a programação contará com uma palestra principal (keynote speaker) seguida de 3 tracks de palestras de 60 minutos cada, até às 19h, quando acontece o encerramento. Há pelo menos 14 palestras já confirmadas.

Não há custo para participar do evento, exceto para aqueles que optarem pagar uma taxa de R$ 15 para alimentação ao longo do dia. Para os minicursos, há uma taxa de inscrição no valor de US$ 95. O número limite de vagas para o evento é 150. Para se inscrever é só acessar o site http://www.sqlsaturday.com/147/eventhome.aspx.”

Fonte: UFPE

Lista de palestras em Recife

http://www.sqlsaturday.com/147/schedule.aspx

Olá pessoal,

Muitas vezes precisamos obter de forma rápida diversos tipos de informações sobre nosso servidor, mas nem sempre isso é uma tarefa fácil quando possuímos diversos servidores.

No script abaixo mostro como podemos listar informações de placa de rede de nossos servidores via Powershell:

cls
#Pegamos informações sobre a placa de rede via WMI, apenas para as que estão ativas
$nets = Get-WMIObject Win32_NetworkAdapterConfiguration | where{$_.IPEnabled -eq “TRUE”}
#Faço um laço nas placas
foreach($net in $nets)
{
    “Caption: ” + $net.Caption
    “Gateway: ” + $net.DefaultIPGateway
    “DHCP ENABLED: ” + $net.DHCPEnabled
    “DHCP SERVER: ” + $net.DHCPServer
    “DNS DOMAIN: ” + $net.DNSDomain
    “DNS HOSTNAME: ” + $net.DNSHostName
    “DNS SERCH ORDER: ” + $net.DNSServerSearchOrder

    “IPs:”
    $I = 0
    #Faço um laço em cada IP de cada placa
    foreach($ip in $net.IPAddress)
    {
        $I++
        “IP $I :” + $ip
    }
   
    Write-Host
    Write-Host
    Write-Host
   
}

É isso ai pessoal, post rápido onde podemos visualizar de forma personalizável as informações de nossas placas de rede. Claro que o script pode ser melhorado para gravar em tabelas ou até mesmo fazer um laço para pegar as informações de diversos servidores. Fica ai a dica.

Grande abraço,

Demétrio Silva

Olá pessoal, hoje vou mostrar um script simples em POSH que pode ajudar muita gente na hora de analisar o log do SQL Server.

Muitas vezes encontramos algum tipo de problema no SQL Server e precisamos analisar o log, no entanto, em servidores com grande atividade ( e muitas vezes sem o trace log 3226 ), o log possui muitas informações e isso termina atrapalhando a análise, pois visualizamos muitas informações desnecessárias e repetidas.

É ai onde entra o Powershell para nos ajudar. O script abaixo lê o log do SQL e nos permite visualizar apenas as informações que julgarmos necessárias, segue o script com comentários:

cls
#Carrega o assembly
[reflection.assembly]::LoadWithPartialName(“Microsoft.SqlServer.Smo”)
#Cria um objeto Server ( é um objeto que encapsula uma instância do SQL Server )
$sqlServer = new-object (“Microsoft.SqlServer.Management.Smo.Server”)
#Lê o log do SQL Server e passa o where pelo PipeLine para filtrar os dados indesejados ( caso queiram apenas
#os desejado troque o -notlike por -like ) e por fim, exporta para um arquivo CSV
$sqlServer.ReadErrorLog() | where {$_.Text -notlike “the process could not*” -and $_.Text -notlike “login failed*” }  | export-csv -path c:\PS.txt -noType

Espero ter ajudado. Qualquer dúvida entrem em contato.

Abraço,

Demétrio Silva