Ehi, spero che tu stia bene.
Voglio dedicare alcuni minuti per iniziare con PowerShell, in un modo che penso sia meno opprimente di come ho trovato la maggior parte del materiale di PowerShell in passato. Perché mi hai detto che continui a sentire parlare di PowerShell e che non puoi dire come entrarci.
La prima cosa da sapere è che sembra un prompt dei comandi con steroidi, ma molto più utile del prompt dei comandi. Vedrai cosa intendo non appena lo apri. Facciamolo, ma apriamolo usando "Esegui come amministratore", perché questo aiuta solo per alcune demo. Nella vita reale, lo aprirai con i diritti di amministratore solo se ne hai davvero bisogno.
Quindi fai clic sul pulsante Start e inizia a digitare PowerShell. Non voglio che tu apra ISE (ancora), trovi il collegamento "Windows PowerShell" e fai clic con il pulsante destro del mouse per scegliere "Esegui come amministratore".
Ora che è in esecuzione, aggiungilo alla barra delle applicazioni, in modo da potervi accedere più rapidamente la prossima volta. Se hai intenzione di provare ad abbracciare PowerShell, dovresti renderlo facile da aprire.
Ad ogni modo, quella finestra... sembra subito che tu debba avere un'idea di cosa scrivere. Sì, è giusto. Le cose potrebbero essere state un po' più facili nell'ISE e Aaron Nelson (@sqlvariant) mi ha rimproverato di non usare l'ISE ogni volta che faccio qualcosa in PowerShell, ma qui starà bene.
Iniziamo facendo alcune cose di base che sappiamo da DOS. I comandi cd
e dir
. Prova questo:
cd .. dir
Vedrai che ti sposterai fino a C:\WINDOWS
, quindi elencare il contenuto. Nessuna sorpresa qui, è proprio come il prompt dei comandi. O DOS se sei abbastanza grande.
La differenza con PowerShell è che questo non è solo un output di testo. Queste cose sono oggetti . E possiamo fare cose con quello. PowerShell è un ambiente "tipizzato". Hai già a che fare con oggetti tutto il tempo, come in Esplora oggetti in SSMS. Gli oggetti PowerShell possono includere tutte queste cose, così come gli oggetti .Net. È qui che PowerShell ottiene il suo potere.
Alcune cose veloci...
- I comandi di PowerShell sono disponibili in coppie verbo-nome, come
Set-Location
oGet-Content
oGet-ChildItem
. Questi sono noti come cmdlet, quindi quando vedi la parola "cmdlet", significa semplicemente un comando di PowerShell. - I parametri del comando PowerShell utilizzano un trattino. Come:
Get-ChildItem -Recurse
ma puoi anche abbreviarli purché non ci siano ambiguità. Quindi potrei usare-rec
invece di-recurse
. - Le variabili iniziano con il simbolo del dollaro (
$
). Ci arriveremo più tardi. - Non utilizziamo
>
nei filtri e nei test utilizziamo-gt
.-eq
per=
,-ne
per!=
/<>
,-le
per<=
, e così via. Questo è frustrante, ma ti ci abituerai. - Ci sono un sacco di abbreviazioni e alias. Un alias per
Set-Location
ècd
.Get-ChildItem
è anche noto comedir
els
anche.Where-Object
è?
eForEach-Object
è%
. Vedremo anche questi mentre andiamo avanti. - Ottieni il completamento delle schede su quasi tutto, quindi se hai digitato
Get-Chi
, puoi premere Tab e scorrere le opzioni fino a trovare quello che desideri. - Puoi usare la guida (che è un alias per
Get-Help
) semplicemente usando:help dir
e in fondo alla guida riceverai un bel promemoria che avresti potuto utilizzarehelp dir -examples
e quello aggiungendo-online
avrebbe aperto una pagina web con la relativa pagina di aiuto (è davvero utile). - Puoi passare i risultati di una cosa in un'altra usando il simbolo pipe (
|
). Forse il più utile ègm
(un alias perGet-Member
), che elencherà le proprietà e i metodi (i membri) per qualsiasi oggetto che hai passato. #
commenterà la riga o passerà tra<#
e#>
Vediamo alcuni di questi in azione.
Qui possiamo vedere alcune cose interessanti. È bello notare che potremmo usare -Exclude
e -Include
. Lo faremo presto. Potremmo ottenere maggiori informazioni utilizzando -detailed
o -examples
o -full
.
Esploriamo la nostra cartella SQL. Inizia digitando cd \p
e quindi premi
Ora premi M e ricomincia a premere Tab per trovare "Microsoft SQL Server". Se vai troppo lontano, premi Maiusc-Tab per tornare indietro. (Oh, e se avresti dovuto guardare D:
, quindi ricomincia con cd D:\p
– ma i principi sono gli stessi.)
Grande. Premiamo Invio e vediamo che abbiamo cambiato directory.
Ma ora scriviamo:dir -rec -inc ConfigurationFile.ini
Avresti potuto premere Tab dopo ogni parametro e vederli espandersi nelle versioni più corrette. Avresti potuto usare Get-ChildItem
essere leggermente più severo. Non mi interessa davvero però. Quando lo esegui, vedrai alcuni file elencati. Non so quanti ne avrai. Ognuno indica che hai eseguito un'installazione di SQL Server. Ma come esperto di SQL, lo sai. Potresti non sapere con quanta facilità PowerShell potrebbe elencarli per te.
Ok. Speriamo di vedere un po' di utilità per questo.
Ora facciamo qualcosa con questo output. Voglio dire "con questi file", ma facciamo la cosa dei dati e pensiamo a questo come a un set di dati di file.
Supponiamo di volerli contare. Potrei scorrere i risultati usando ForEach-Object
(ma userò la scorciatoia %
) e incrementare una variabile che ho impostato. Questo è un modello comune per il ciclo:le persone mettono interi programmi all'interno di quelle parentesi graffe, su molte righe.
Questo fa il trucco, ma sono sicuro che c'è qualcosa integrato per farmi contare le cose.
Bene, non riesco mai a ricordare quale sia quel comando, quindi chiediamo a uno di quei fantasiosi provider di ricerca su Internet.
Non voglio nemmeno aprire queste pagine. Voglio solo notare che c'è un comando chiamato Measure-Object
. Conduciamo il nostro output in quello. Premi il tasto "freccia su" per tornare a un comando precedente.
Questo richiede un momento, e poi felicemente ci dice che ce ne sono tre.
Ci vuole un momento perché è necessario cercare di nuovo tra i file. Che ne dici di archiviare quei risultati da qualche parte?
Ora, io chiamo queste cose parentesi, ma gli americani le chiamano parentesi. E ciò che tu chiami parentesi, io chiamo parentesi quadre. Ci sono anche parentesi graffe, che tu chiami parentesi, credo. Proverò a chiamare le parentesi "parentesi tonde" per evitare confusione, ma se mi riferisco a una "parentesi", intendo una parentesi.
Vado a capovolgere la mia dir
comando tra parentesi tonde e assegnarlo a una variabile.
Ora posso reindirizzare $configfilelist
in Measure-Object
e sarà più reattivo, perché ho memorizzato i miei risultati.
Ma perché $configfilelist
è una matrice di file, posso anche guardare la sua lunghezza per vedere che ci sono tre elementi. È molto più facile. E posso accedere a ciascuno utilizzando parentesi quadre da 0 a 2.
Questa non è ancora esattamente roba rivoluzionaria. Ma quei file ci dicono alcune cose utili. Facciamo un Get-Member
comando sul nostro array.
Non lasciarti scoraggiare da questo. In alto possiamo vedere che abbiamo a che fare con oggetti di tipo System.IO.FileInfo
. Questa è una cosa .Net ed è da dove viene il potere. Possiamo vedere che potremmo chiamare Delete
metodi di questi file o CopyTo
o Decrypt
(se erano crittografati, ma non lo sono) e altro ancora. In basso vediamo Proprietà.
Questo è più interessante. Diamo un'occhiata a LastWriteTime
. Perché potremmo essere interessati a quando sarà.
Possiamo usare Select-Object
per mostrare solo determinate proprietà.
Come previsto, non viene scritto nulla su quei file poiché le installazioni sono state effettivamente eseguite. Ma cosa succede se volessi filtrare questo, solo per quelli da un determinato momento?
Userò Get-Date
per ottenere la data e l'ora correnti. Lo racchiuderò tra parentesi tonde e userò i suoi AddYears
metodo per trovare un anno fa. Nel mondo reale sarei più propenso a usare AddDays
, ma voglio ottenere dei risultati.
E filtrerò $configfilelist
passando in Where-Object
(tranne che userò una comoda scorciatoia che è il punto interrogativo). Il mio filtro è racchiuso tra parentesi graffe ("bretelle", giusto?), e all'interno di quelle parentesi graffe mi riferisco alle cose in $configfilelist
utilizzando $_
.
Quindi il mio filtro va in questo modo, dicendo che voglio elencare quelli che hanno un LastWriteTime
maggiore di (-gt
) un anno prima:
E ottengo solo un file. Eccezionale.
Va tutto bene, ma ora voglio sapere di cosa trattava quell'installazione. Per questo dobbiamo guardare all'interno del file. Get-Content
è nostro amico qui. Iniziamo usando Get-Content
direttamente contro un file. Sarà facile collegarlo al nostro comando corretto in seguito.
Get-Content
in realtà restituisce un array di righe e ha parametri davvero utili come -TotalCount
che si ferma dopo un certo numero di righe, oppure -Tail
che ottiene le righe alla fine del file. Adoro questo quando ho a che fare con file di grandi dimensioni:non è che posso aprirli in Blocco note.
Lascia che ti parli di Seleziona-Stringa anche. È come grep
da Unix:lo usi per ottenere le righe che desideri in un file.
Quell'output sembra una seccatura, ma ricorda che questa è solo la rappresentazione di stringa di un oggetto. Se convoglio il mio comando in gm
(Get-Member
), vedrai cosa intendo.
Quindi ora posso dire che posso accedere al Path
del file, la Line
, il LineNumber
, ecc., separatamente.
Per cercare più cose, voglio passare un array di parametri a -Pattern
. Lo faccio semplicemente usando una virgola, per scoprire che si trattava di un'installazione di Analysis Services.
Spero che tu stia iniziando a vedere il potere di questo.
Posso trascinarlo tutto in una riga usando:
dir -rec -inc ConfigurationFile.ini | ? {$_.LastWriteTime -gt (Get-Date).AddYears(-1)} | select-string -Pattern 'FEATURES=','ACTION=' | select-object Path, Line
(Spiacente, probabilmente dovrai scorrere lateralmente per vedere tutto questo:ottenere tutto su una singola riga non è esattamente una virtù in HTML.)
Quando stai elaborando le cose che ti piacciono, ti consigliamo di archiviare i comandi da qualche parte per dopo (ad esempio in un file .ps1 che esegui). Per questo, vuoi essere a conoscenza di Get-History
. Elenca tutto ciò che hai eseguito in quella sessione.
E un piccolo trucco è che puoi usare numeri negativi per agganciarti agli array dall'altra parte. Quindi puoi farlo:
Ma invece di mostrarlo semplicemente, inseriscilo in clip
:
...che lo inserisce negli appunti.
Non andrò molto oltre con questo, ma potresti continuare a spingerlo sempre più lontano, esplorando i tipi di cose che potrebbero essere interessanti nel tuo lavoro. Puoi scaricare i risultati in file usando >
e aggiungi ai file usando >>
.
Ora considera comandi come:
Get-EventLog -LogName Application -After (Get-Date).AddHours(-1) -EntryType Error
...e immagina cosa potresti farci.
Prova a fare:Import-Module SQLServer
Che poi ti lascia andare:
cd SQLSERVER:
E sfoglia l'ambiente SQL come se fosse un file system.
Non tendo a usare PowerShell per esplorare SQL in questo modo molto spesso, devo ammettere. Ma il fatto che posso certamente mi dà un sacco di opzioni. Il fatto che potrei usare PowerShell per creare un documento Word come fanno su https://learn-powershell.net/2014/12/31/beginning-with-powershell-and-word/, o inviare e-mail come descritto in https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/send-mailmessage o chiama i servizi Web (inclusi quelli di Azure Machine Learning) come descritto in https://docs.microsoft. .com/en-gb/powershell/module/Microsoft.PowerShell.Utility/Invoke-WebRequest significa che con un po' di immaginazione, puoi usare PowerShell per fare qualsiasi cosa tu voglia. Mi piace usare Invoke-SqlCommand per ottenere dati da SQL, inserirli in Invoke-WebRequest
per ottenere i punteggi da Azure ML e quindi rispondere di conseguenza. PowerShell lo rende davvero semplice.
Oh, e per eseguire i comandi di PowerShell su altre macchine (che possono essere molto utili, ovviamente), una rapida "ricerca su Internet" mi ha mostrato questa pagina dall'aspetto utile:https://www.howtogeek.com/117192/how-to -run-powershell-commands-on-remote-computers/
Potresti avere un elenco di computer all'interno di un file e scorrerlo in questo modo:
Prova alcune cose. Mettiti al tappeto. Ed esplora ciò che tutti scrivono per T-SQL martedì questo mese, ospitato da Rob Sewell (@sqldbawithbeard)
@rob_farley