Cum se deschide powershell Windows 7. Windows PowerShell Basics

73095

Și în timp ce studiază meniul Start al Windows 7 sau ecranul Start 1 al Windows 8, utilizatorii începători descoperă adesea aplicații al căror scop nu îl înțeleg. Doar o astfel de aplicație este PowerShell. Ce este acest PowerShell și este de folos? Ei bine, din moment ce cineva a venit cu el și l-a integrat în Windows, înseamnă că, până la urmă, are ceva sens. Apropo, compania care a inventat PowerShell este Microsoft.


Asa de, . Această aplicație este destinată în primul rând administratorilor de sistem, dar utilizatorii obișnuiți, în special începătorii, aproape că nu vor beneficia de ea. PowerShell este un shell modern standardizat Linie de comanda, oferind o mai mare flexibilitate în gestionarea unui computer bazat pe sistemul de operare sisteme Windows. În esență, PowerShell este același Linie de comanda, dar doar mult mai funcțional.

Ce poate face acest instrument de administrare? Multe lucruri. Cu ajutorul acestuia, administratorii de sistem și utilizatorii avansați pot gestiona procesele, serviciile, stocarea fișierelor, conturile și chiar serverele. Shell-ul vă permite, de asemenea, să rulați comenzi externe și să lucrați cu obiecte .NET, COMȘi XML, efectuați diverse trucuri etc., creați și realizați propriile scenarii. Apropo, pentru scrierea scripturilor în Windows există o consolă grafică specială EU VAD., care este un fel de completare la shell-ul principal PowerShell.

La fel ca consola CMD, PowerShell are propriul set de comenzi numite cmdleturi. Utilitarul recunoaște multe dintre comenzile CMD, dar, în general, sintaxa limbajului, definițiile cmdlet-urilor și parametrii acestora diferă de ceea ce utilizatorii sunt obișnuiți să vadă într-o linie de comandă obișnuită. În plus, comenzi familiare precum dir , CD , copie etc., care sunt perfect înțelese de PowerShell, sunt de fapt aliasuri. De exemplu, comanda Dir , folosit pentru vizionare Sistemul de fișiere se potrivește cu cmdlet-ul nativ Get-ChildItem. Pseudonimele sau, după cum se spune, pseudonimele, sunt doar pentru comoditate.

Înțelegerea PowerShell pentru un utilizator începător, mai ales dacă nu este familiarizat cu cel puțin elementele de bază ale unei linii de comandă obișnuite, nu va fi ușoară. Dar nu există atât de multe manuale și cărți de referință suficient de clare și ușor de înțeles. Există un ghid bun scris de Frank Koch, pe care vă recomandăm să îl citiți dacă decideți să începeți să învățați limbajul de scripting PowerShell. Ei bine, și, desigur, propriul sistem de ajutor al shell-ului.

Este puternic și cuprinzător, cu multe exemple specifice. Este destul de simplu de folosit. Informațiile de bază despre sistemul de ajutor sunt afișate de cmdlet Obține ajutor. Cmdletul afișează o listă cu toate comenzile disponibile.

Este posibil ca utilizatorii experimentați ai sistemului de operare Windows 10 să fi auzit de utilitarul pentru linia de comandă PowerShell. Cei cu experiență în lucrul cu Windows 7 și 8.1 pot fi, de asemenea, familiarizați cu acesta. După ani de utilizare a aplicației de linie de comandă Windows și a fișierelor .bat, este timpul să faceți cunoștință cu un instrument mai puternic.

PowerShell este un plus valoros la lista de instrumente Windows, iar domeniul său de aplicare poate fi intimidant pentru unii utilizatori. Ce este - un limbaj de scripting sau un shell de comandă? Nu vă faceți griji: în ciuda capacităților extinse, oricine poate stăpâni PowerShell.

Pasul 1: Instalare

În primul rând, avem nevoie de utilitarul PowerShell în sine. Dacă utilizați Windows 10, aveți deja instalat PowerShell 5. Windows Update Actualizarea a 10-a aniversare folosește versiunea 5.1, dar diferența nu este vizibilă. Windows 8 și 8.1 folosesc PowerShell 4, care este, de asemenea, destul de suficient. Instalarea PowerShell pe Windows 7 nu va cauza probleme, dar va trebui totuși să faceți câțiva pași suplimentari. În special, trebuie să instalați suplimentar .Net Framework. Puteți instala Windows Management Framework, care include PowerShell.

PowerShell are două interfețe. Utilizatorii avansați pot opta pentru o interfață GUI completă cunoscută sub numele de Integrated Scripting Environment (ISE). Pentru începători, cel mai bine este să utilizați consola PowerShell, o interfață simplă în stil linie de comandă Windows bazată pe text sau chiar DOS 3.2.

Pentru a rula PowerShell ca administrator în Windows 10, faceți clic pe butonul Start și derulați în jos la Windows PowerShell. Pe Windows 8.1, căutați Windows PowerShell în folderul System din Windows. În Windows 7, shell-ul se află în folderul Accesorii. Ca utilizator obișnuit, PowerShell poate fi lansat în același mod, folosind butonul stâng al mouse-ului în loc de cel drept.

La orice versiuni Windows puteți aplica o căutare. Pentru ușurința utilizării viitoare, puteți fixa PowerShell în bara de activități.

Pasul 2: Comenzi vechi Windows

Sintaxa comenzii Windows din PowerShell funcționează ca de obicei. De exemplu, CD modifică folderele, dir afișează o listă cu toate fișierele și folderele din dosarul curent.

În funcție de modul în care lansați consola PowerShell, este posibil să începeți în c:\Windows\system32 sau în c :\Utilizatori\ . Exemplul din captura de ecran folosește comanda CD..(cu un spațiu) pentru a urca un nivel la un moment dat, apoi rulați comanda dir pentru a afișa o listă de fișiere și foldere dintr-un director C:\.

Pasul 3: Instalați fișierele de ajutor

Echipe ca CDȘi dir nu sunt comenzi PowerShell active. Acestea sunt așa-numitele aliasuri - înlocuitori pentru comenzile reale PowerShell. Aliasurile sunt utile pentru cei care au o experiență vastă cu linia de comandă. Cu toate acestea, ele nu ating adâncimea PowerShell.

Pentru a începe cu PowerShell, tastați Ajutorși comanda de care aveți nevoie. Captura de ecran arată comanda .

Echipă Ajutor spune ca dir este un alias pentru comanda PowerShell Get-ChildItem. Dacă tastezi get-childitem V PS C:\>, veți vedea același lucru ca atunci când utilizați comanda dir.

După cum s-a menționat în partea de jos a capturii de ecran, fișierele de ajutor pentru PowerShell nu sunt instalate automat. Pentru a le obține, rulați PowerShell ca administrator și tastați update-help. Instalarea fișierelor de ajutor va dura câteva minute; este posibil să lipsească un număr de module - de exemplu, în acest caz, Help for NetWNV și SecureBoot nu au fost instalate. Când totul este gata, sistemul complet de ajutor va oferi întotdeauna sfaturile necesare.

Acum tastați comanda obține ajutorși orice comandă de care sunteți interesat („cmdlet” în PowerShell, cmdlet-uri în rusă), va fi afișată descrierea acesteia. De exemplu, get-help get-childitem afișează o listă de opțiuni get-childitem. De asemenea, puteți afișa diferite opțiuni posibile. De exemplu

get-help get-childitem -exemple

oferă șapte exemple detaliate de utilizare get-childitem. Echipă

get-help get-childitem -detaliat

include aceste șapte exemple și explicații detaliate ale fiecărui parametru din cmdlet get-childitem.

Pasul 4: Obțineți ajutor cu setările

În captura de ecran este posibil să fi observat două liste mai jos SINTAXĂ Pentru get-childitem. Având două sintaxe diferite înseamnă că există două moduri de a rula cmdletul. Cum să păstrăm sintaxa separată una de cealaltă și ce înseamnă parametrii? Răspunsul este simplu dacă știi trucul.

Pentru detalii referitoare la parametrii cmdlet-ului get-childitem sau orice alt parametru de utilizare -deplin:

get-help get-childitem -full

Aceasta vă oferă o listă cu ceea ce puteți face cu cmdletul și ce se va întâmpla. Uită-te la captura de ecran.

Revizuind descrierile parametrilor, veți observa că get-childitem face posibilă obținerea unui obiect copil(cum ar fi un nume de subdosar sau un nume de fișier) într-o locație specificată, cu sau fără potrivirea anumitor caractere. De exemplu:

get-childItem „*.txt” -recurse

returnează o listă de fișiere „*.txt” din folderul curent și toate subfolderele (datorită parametrului -recurs). Întrucât

get-childitem „HKLM:\Software”

returnează o listă cu toate cheile de registry de nivel superior în HKEY_LOCAL_MACHINE\Software.

Dacă ați încercat vreodată să intrați în registry folosind linia de comandă Windows sau fișierele .bat, veți aprecia funcționalitatea acestei opțiuni de acces.

Pasul 5: Învățarea numelor

Există un motiv pentru care cmdleturile afișate până acum arată similare: get-childitem, update-help, get-help utilizați un singur model verb-substantiv. Toate cmdleturile PowerShell folosesc această convenție; folosesc un verb înaintea unui singur substantiv. Acest lucru îi va atrage pe cei care au suferit cândva de nume de comenzi inconsecvente în limbile VB și VBA.

Aruncă o privire la cele mai comune cmdleturi:

set-locație: setează locația curentă de lucru într-o anumită locație

obţine-conţinut: Obține conținutul fișierului

obţine-element: Preia fișiere și foldere

element de copiere: copiază un obiect dintr-o locație în alta

eliminare-articol: Șterge fișierele și folderele

: Primește procesele care rulează pe un computer local sau la distanță

obţine-serviciu: Primește serviciile care rulează pe un computer local sau la distanță

invoke-webrequest: Preia conținut dintr-o pagină web de pe Internet

Pentru a vedea cum funcționează un anumit cmdlet, utilizați obține ajutor ca în cazul

get-help copy-item -full

Pe baza descrierii din ajutor, puteți înțelege de ce are nevoie cmdletul. De exemplu, dacă doriți să copiați toate fișierele și folderele din Documente V c:\temp, utilizare

element de copiere c:\users\ \documents\* c:\temp

Tastând această comandă, veți vedea câteva caracteristici interesante ale mediului PowerShell. De exemplu, dacă tastați copie-iși apăsați butonul Tab, PowerShell va completa Element de copiere. Dacă tastați incorect un cmdlet și PowerShell nu îl poate recunoaște, acesta este dat Descriere completa ce s-a făcut greșit.

Încercați acest cmdlet:

invoke-webrequest askwoody.com

Veți primi o listă scurtă cu titlurile paginii web, imaginile, linkurile și alt conținut. Vă rugăm să rețineți în obține ajutor la listă invoke-webrequest, care „returnează o colecție de formulare, link-uri, imagini și alte elemente HTML importante” – exact ceea ce ar trebui să fie afișat pe ecran.

Unele cmdleturi vă ajută să gestionați PowerShell în sine:

obţine-comandă: lista tuturor cmdlet-urilor disponibile

obţine-verb: lista tuturor verbelor disponibile

limpede-gazdă: Ștergeți ecranul programului gazdă

Diferiții parametri vă permit să reduceți comenzile și să restrângeți gama de opțiuni utile. De exemplu, pentru a vedea o listă cu toate cmdleturile care funcționează cu serviciile Windows, tastați

get-command *-service

Vor fi afișate toate verbele disponibile cu substantivul serviciu. Iată lista lor:

Obține-Service

Serviciu nou

Restart-Service

CV-Serviciul

Set-Service

Start-Service

Stop-Service

Suspendare-Serviciul

Puteți combina aceste cmdleturi cu altele.

Pasul 6: Utilizarea țevilor

Dacă sunteți familiarizat cu linia de comandă Windows sau cu fișierele batch, atunci știți despre redirecționare și conducte. Redirecționarea (> simbol) și conductele (simbol |) preiau rezultatul unei acțiuni și îl atașează la o altă locație. De exemplu, puteți redirecționa rezultatul comenzii dirîntr-un fișier text sau transmiteți rezultatul comenzii ping la echipa găsi pentru a filtra rezultate interesante precum

dir > temp.txt

ping askwoody.com | găsiți „pachete” > temp2.txt

Aici la echipa a doua găsi caută un șir pachete, preluat de pe adresa askwoody.com de către echipă pingși concatenează toate liniile care se potrivesc într-un fișier numit temp2.txt.

Prima dintre aceste comenzi funcționează bine în PowerShell. Pentru a rula a doua comandă veți avea nevoie de ceva de genul

ping askwoody.com | pachete select-string | out-file temp2.txt

Utilizarea redirecționării și a conductelor extinde foarte mult capacitățile liniei de comandă Windows: în loc să derulați la nesfârșit ecranul pentru a căuta un șir de text, puteți filtra comenzile Windows de care aveți nevoie.

Powershell are suport teavași nu se limitează la text. PowerShell vă permite să treceți un întreg obiect de la un cmdlet la altul, unde obiectul este o combinație de date (numite proprietăți) și acțiuni (metode) care pot folosi acele date.

Partea dificilă vine atunci când aliniezi obiectele. Obiectele furnizate de un cmdlet trebuie să se potrivească cu tipul de obiecte acceptate de cmdlet-ul primitor. Textul este un tip de obiect foarte simplu, așa că dacă lucrați cu text, alinierea obiectelor este o sarcină simplă. Obiectele rămase nu sunt atât de elementare.

Cum să înțelegi asta? Utilizați cmdlet obţine-membru. Dacă doriți să știți prin ce tip de obiect procesează un cmdlet, rulați-l obţine-membru. De exemplu, dacă încercați să înțelegeți procesele care rulează pe un computer și ați restrâns opțiunile la cmdleturi , iată cum puteți afla rezultatul cmdlet-urilor:

obţine-proces | obţine-membru

Rularea acestui cmdlet produce o listă lungă de proprietăți și metode pentru , dar chiar la începutul listei puteți vedea tipul de obiect care creează :

TypeName: System.Diagnostics.Process

Captura de ecran de mai jos arată și proprietățile intitulat get-process Handle, Nume, NPM, PM, SI, VMȘi W.S..

Dacă doriți să manipulați rezultatul Pentru a lucra cu acest cmdlet (în loc să afișați o listă lungă de procese active pe monitor), trebuie să găsiți o altă comandă care să ia ca intrare Sistem.Diagnosticare.Proces. Pentru a găsi cmdletul de care aveți nevoie, utilizați din nou PowerShell:

get-command -Parametertype System.Diagnostics.Process

Acest cmdlet oferă o listă de cmdleturi care pot fi procesate Sistem.Diagnosticare.Proces.

Unele cmdleturi sunt cunoscute pentru că acceptă aproape orice tip de date. Principalul dintre ei este . Acest cmdlet trece prin fiecare obiect trimis prin conductă, unul câte unul și îi aplică criteriile de selecție specificate. Există un marker special numit $_ , care vă permite să utilizați fiecare articol din conductă, unul câte unul.

Să presupunem că doriți să obțineți o listă cu toate procesele care rulează pe un computer cu numele „svchost”, adică doriți să potriviți proprietatea Nume proces svchost. Utilizați comanda:

obţine-proces | unde-obiect ($_.Name -eq „svchost”)

Cmdlet se uită la fiecare obiect Sistem.Diagnosticare.Proces, compară .Nume acest obiect cu „svchost”; dacă există potriviri, acestea sunt afișate pe monitor. Uită-te la captura de ecran.

Pasul 7: Analizați comenzile PowerShell utile

Până acum știți deja suficient pentru a putea deteriora computerul, așa că aveți grijă. Să ne uităm, de exemplu, la comenzile PowerShell solicitate frecvent.

Aceste comenzi funcționează numai pe Windows 10 și numai atunci când rulați PowerShell ca administrator. Sunt concepute pentru a reinstala aplicațiile Windows 10 preinstalate și pot fi utile celor care au dezinstalat mai întâi aceste programe și apoi au decis să le returneze. Comenzile arată astfel:

Get-AppXPackage | Foreach (Add-AppxPackage -DisableDevelopmentMode -Înregistrați „$($_.InstallLocation)\AppXManifest.xml”)

Dacă executați această comandă, ignorați avertismentele roșii și, când comanda este finalizată, reporniți computerul; toate programele preinstalate în Windows 10 vor apărea la locul lor.

Iată cum funcționează această comandă. Get-AppXPackage verifică toate pachetele de aplicații din profilul utilizatorului. Chiar dacă ștergeți aplicația, aceasta rămâne în lista de profiluri de utilizator.

Cmdlet Get-AppXPackage returnează un obiect TypeName Microsoft.Windows.Appx.PackageManager.Commands.AppxPackage, care include Numele complet pachetul aplicației și locația fișierului manifest XML corespunzător. Dacă rulați cmdletul get-appxpackage, veți vedea o listă lungă de pachete de aplicații. Captura de ecran arată descrierea aplicației Xbox.

Cmdlet Pentru fiecare circulă prin fiecare obiect în AppXPackage prin trimiterea lor către cmdlet Add-AppxPackage. Conform obține ajutor Pentru Add-AppxPackage, există două comutatoare cu cheie:

  • Intrerupator -Inregistreaza-te folosit pentru a înregistra instalațiile existente ale pachetelor de aplicații, puteți seta parametri Dezactivați modul de dezvoltareȘi Inregistreaza-te
  • Intrerupator -Dezactivați modul de dezvoltare spune Windows să reînregistreze un pachet de aplicații existent care a fost dezactivat, neînregistrat sau corupt.

linia " $($_.InstallLocation)\AppXManifest.x ml" descrie unde se află fișierul manifest.xml. Dacă te uiți la fișiere AppXManifest.xml, veți vedea o listă complexă de ID-uri de aplicație, fișiere executabile și un număr mare de elemente vizuale asociate cu aplicația.

După repornire, toate pachetele de aplicații adăugate sunt descărcate și instalate din Windows Store.

Rularea unui program din PowerShell

Sarcina de a rula orice fișier executabil (program sau utilitar de linie de comandă) din PowerShell apare destul de des. PowerShell oferă mai multe opțiuni pentru aceasta. în diverse moduri, pe care îl vom analiza mai târziu în acest articol. Să începem cu cel mai simplu...

Lansare directă

Cel mai simplu mod de a rula un executabil în PowerShell este să navigați la directorul cu fișierul și să îl rulați direct. De exemplu, să luăm un program simplu care afișează un salut și să-l executăm cu comanda:

Set-Location ″C:\Program Files″
.\Bună ziua.exe

Vă rugăm să rețineți că, chiar dacă vă aflați în directorul dorit, trebuie să specificați calea relativă către fișierul executabil. Excepție fac fișierele din directoarele listate în variabila de mediu (cale). De exemplu, diverse programe și utilitare încorporate (notepad, calc, ping etc.) aflate în directorul Windows\System32 pot fi lansate fără a specifica calea.

Operator &

Dacă trebuie să specificați calea completă către fișierul executabil, puteți utiliza operatorul & (operator de apel). Vă permite să executați un șir de text între ghilimele ca o singură comandă. De exemplu:

& ′C:\Program Files\Hello.exe′

Deoarece operatorul & nu analizează comanda transmisă, nu poate interpreta parametrii acesteia. Prin urmare, parametrii/argumentele suplimentari sunt de asemenea trecuți ca text, între ghilimele. Ca exemplu, să luăm programul anterior și să-l modificăm ușor, astfel încât să accepte textul dorit ca argument:

& ′C:\Program Files\Hello.exe′ ′Salut, lume′

Dacă doriți, puteți specifica mai multe argumente separate prin virgule:

& ′C:\Program Files\Hello.exe′ ′Bună ziua,′, ′ lume′

Pentru comoditate, comanda și argumentele pot fi plasate în variabile:

$exe = ′C:\Program Files\Hello.exe′
$arg1 = „Bună ziua”
$arg2 = „lume”
& $exe $arg1 $arg2

Ei bine, dacă există o mulțime de argumente, atunci acestea pot fi combinate folosind următoarea construcție:

$exe = ′C:\Program Files\Hello.exe′
$allargs = @(′Bună,′,′lume′)
& $exe $allargs

Invocare-Expresie

Cmdletul Invoke-Expression funcționează aproape în același mod ca și operatorul & — ia un șir de text și îl execută ca o comandă. De exemplu:

Invoke-Expression -Comandă ′C:\Windows\Hello.exe′

Cu toate acestea, are un mare dezavantaj, și anume incapacitatea de a lucra cu spații. De exemplu, următoarea comandă va provoca o eroare:

Invoke-Expression -Comandă ′C:\Program Files\Hello.exe′

Această caracteristică face utilizarea cmdlet-ului extrem de incomod. Deși, dacă este necesar, astfel de erori pot fi evitate folosind ghilimele suplimentare, de exemplu ca aceasta:

Invoke-Expression -Comandă ″C:\′Fișiere de program’\Hello.exe″

Start-Proces

Cmdletul Start-Process pornește fișierul specificat ca proces folosind metoda start Clasa .NET Proces. De exemplu:

Start-Process -FilePath ′C:\Program Files\Hello.exe′

În mod implicit, procesul rulează într-o fereastră separată, care se închide când procesul este finalizat. Puteți modifica acest comportament folosind parametrii, astfel încât următoarea comandă va rula în fereastra curentă:

Start-Process -FilePath ′C:\Program Files\Hello.exe′ -NoNewWindow -Wait

Start-Process vă permite, de asemenea, să transmiteți argumente suplimentare procesului:

Start-Process -FilePath ′C:\Program Files\Hello.exe′ -ArgumentList ′Hello, world′ -NoNewWindow -Wait

În mod implicit, cmdletul nu returnează nimic, dar puteți utiliza parametrul -PassThru pentru a-l forța să returneze un obiect de proces. Este foarte convenabil să plasați acest obiect într-o variabilă:

$process = Start-Process -FilePath ′C:\Program Files\Hello.exe′ -Wait -PassThru

din care puteți afla apoi multe lucruri utile, cum ar fi starea:

$process.HasExited

$process.ExitTime

sau cod de execuție:

$proces.ExitCode

.NET

În principiu, clasa .NET Process poate fi utilizată direct, fără cmdletul Start-Process. De exemplu, puteți începe procesul cu comanda:

::Start(′C:\Program Files\Hello.exe′)

Această metodă este destul de incomodă și greoaie (după părerea mea), dar puțin mai flexibilă în utilizare. De exemplu, să rulăm programul nostru în fereastra curentă, să îi transmitem argumente și să luăm rezultatul execuției:

$process = New-Object -TypeName System.Diagnostics.Process
$process.StartInfo.FileName = ″C:\Program Files\Hello.exe″
$process.StartInfo.Arguments = ″Bună ziua, lume″
$process.StartInfo.RedirectStandardOutput = $true
$process.StartInfo.UseShellExecute = $false
$process.Start()
$process.WaitForExit()

$process.StandatdOutput.ReadToEnd()

WMI

Puteți face aproape orice cu WMI, inclusiv rularea unui program. Metoda este destul de potrivită pentru asta Crea Clasa WMI Win32_Process. Această metodă începe un proces pe o mașină locală sau la distanță prin RPC. De exemplu, pentru a rula un program pe computerul local, puteți utiliza următoarea comandă:

()″Win32_Process″).Creare(′C:\Program Files\Hello.exe′)

Și pentru a executa pe un computer la distanță, comanda va arăta astfel:

()″\\remotecomputer\root\cimv2:Win32_Process″).Creează(′C:\Program Files\Hello.exe′)

Alternativ, puteți utiliza cmdletul Invoke-WmiMethod:

Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList ″C:\Program Files\Hello.exe″

Sau folosind cmdletul Invoke-CimMethod:

Invoke-CimMethod -ClassName Win32_Process -MethodName Creare -Argumente @(CommandLine=″C:\Program Files\Hello.exe″)

WMI rulează procesul într-o fereastră separată și returnează un obiect care conține ID-ul procesului (ProcessID) și rezultatul execuției (ReturnValue). ReturnValue poate lua următoarele valori:

0 — Finalizare cu succes
2 -Acces interzis
3 — Privilegiul insuficient
8 — Eșec necunoscut
9 — Calea nu a fost găsită
21 - Parametru invalid

Invocare-Comandă

Cmdletul Invoke-Command poate executa comenzi pe un computer local sau la distanță folosind WinRM. De exemplu, pentru a rula programul nostru pe computerul local folosim comanda:

Invoke-Command -ScriptBlock (″C:\′Fișiere de program′\Hello.exe″)

Dacă este necesar, puteți transmite argumente programului:

Invoke-Command -ScriptBlock (C:\′Program Files′\Hello.exe ″Hello,world″)

Vă rugăm să rețineți că Invoke-Command nu este foarte prietenos cu spațiile, așa că pentru a evita erorile trebuie să fiți creativ cu ghilimele. Cu toate acestea, astfel de probleme pot fi evitate, de exemplu, prin combinarea utilizării cmdlet-ului cu operatorul &:

Invoke-Command -ScriptBlock (& ​​′C:\Program Files\Hello.exe′)

Invoke-Command este utilizat în principal pentru control de la distanță; principalul său avantaj este capacitatea de a executa simultan pe mai multe computere. De exemplu:

Invoke-Command -ScriptBlock (″C:\′Program Files′\Hello.exe″) -ComputerName SRV1,SRV2,SRV3

$scriptblock = (″C:\′Fișiere de program′\Hello.exe″)
$Computer = @(′SRV1′,′SRV2′,′SRV3′)
Invoke-Command -ScriptBlock $scriptblock -ComputerName $Computer

În mod implicit, cmdletul returnează rezultatul execuției programului, iar dacă îl rulați în fundal (parametrul -AsJob), returnează un obiect Job:

Invoke-Command -ScriptBlock (C:\′Fișiere de program′\Hello.exe) -ComputerName localhost -AsJob -JobName Bună ziua

Invocare-Articol

Cmdletul Invoke-Item este conceput pentru a aplica o acțiune implicită unui fișier. Deci, puteți rula fișierul executabil cu comanda:

Invoke-Item -Cale ″C:\Program Files\Hello.exe″

Cu toate acestea, cel mai convenabil este să utilizați Invoke-Item pentru a deschide un anumit tip de fișier. De exemplu, așa deschidem un fișier text:

Invoke-Item -Cale ″C:\Files\test.txt″

Și iată toate fișierele text din folder:

Invoke-Item -Cale ″C:\Files\*.txt″

CMD

Ei bine, în concluzie, o altă modalitate de a lansa un program din PowerShell este utilizarea cmd shell. Metoda este destul de „indirectă”, dar funcționează totuși. Următoarea comandă pornește o nouă instanță cmd, execută programul specificat în ea, iese din cmd și returnează rezultatul:

cmd /c ″C:\Program Files\Hello.exe″

PoSh oferă o astfel de abundență de modalități de a lansa un program. Și fiecare dintre ele este bun pentru anumite situații.

Apropo, articolul a fost scris pe baza PowerShell: Deep Dive și cele mai bune practici. Recomand să-l citiți, există încă o mulțime de lucruri interesante acolo.

Sunt puțin șocat de răspunsurile propuse, care se rezumă la „descărcați și instalați software suplimentar”... și astfel sistemul are deja sub 20 GB de un fel de rahat util numit sistem de operare... scuze, a ieșit.

Cândva în Windows XP am folosit cel mai simplu utilitar mplay pentru această sarcină, deși GUI și task scheduler se lansează normal, dar în Windows 7 l-au eliminat și chiar sndrec32. Consider că este stupid să lansez monstruosul wmplayer, așa că trebuie să apelez la limbaje de scripting.

Exemple de scripturi pe o singură linie în vbs pentru Windows scripting host pot fi găsite pe Internet, aici cel mai simplu exemplu:

A stabilit oVoice = CreateObject("SAPI.SpVoice" )
a stabilit oSpFileStream = CreateObject("SAPI.SpFileStream" )
oSpFileStream.Deschideți „c:\Windows\Media\tada.wav”
oVoice.SpeakStream oSpFileStream
oSpFileStream.Close

Apropo, este un miracol că codul a funcționat pe Windows 7, deoarece în comparație cu Windows XP au dispărut o serie de obiecte activex (cum ar fi WMPlayerClass) și nimeni nu știe când va dispărea clasa SAPI sau cum se va schimba clasa SAPI, și nu este vorba de a bate cuie cu microscopul. Prin urmare, consider că această decizie este greșită și ilogică, iar ActiveX se stinge încet, fiind destul de logic ucis de mediul .NET.

Am încercat să rezolv problema folosind PowerShell nou (nu știu să gătesc, dar am scotocit în mod deliberat prin documentație), mi s-a ridicat părul pe cap la cât de minunate au fost combinate cu o implementare groaznică. De exemplu, nu există o modalitate normală de a rula un script din linia de comandă fără a crea și a semna un fișier (înțeleg totul, securitatea este pe primul loc, ca urmare, există întrebări despre dacă merită folosit).

Iată cel mai simplu cod:

$s=new-Object System.Media.SoundPlayer;$s.SoundLocation="C:\Windows\Media\tada.wav";$s.Play();
Funcționează grozav în interiorul Powershell dacă este lipit și executat manual!

Dar astfel:

powershell -Comandă $s=new-Object System.Media.SoundPlayer;$s.SoundLocation="C:\Windows\Media\tada.wav";$s.Play();
Nimic nu se întâmplă deoarece fiecare comandă este executată în propriul context (adică $s este nedefinit la fiecare pas).

Am încercat să folosesc redirecționarea:

echo $s=new-Object System.Media.SoundPlayer;$s.SoundLocation="C:\Windows\Media\tada.wav";$s.Play(); | powershell -comandă -
Și am fost șocat de rezultat - playerul înregistrat implicit a fost lansat pe un fișier wav (pentru mine s-a dovedit a fi Winamp). De ce pe pamânt?

Și fără a folosi -command -:

echo $s=new-Object System.Media.SoundPlayer;$s.SoundLocation="C:\Windows\Media\tada.wav";$s.Play(); | powershell
PowerShell pur și simplu pornește și așteaptă să fie introduse comenzi.

Bine, renunț, să încercăm să permitem scripturi nesemnate (rulate sub un shell privilegiat):

powershell Set-ExecutionPolicy Unrestricted
Creăm și rulăm un fișier cu codul de mai sus (plasându-l în c:\a.ps1): Și nu obținem nimic! Tăcere și fără mesaje de eroare (dacă lansarea de scripturi nesemnate nu este permisă, primesc un mesaj corespunzător).

Nu te-ar ajuta respectata comunitate habra să rezolvi această problemă într-un mod simplu și corect din punct de vedere rasial? Din câte am înțeles, cel mai recent test a arătat că epopeea cu certificate nu merită începută, deoarece problema este în altă parte.

UPD din și: nici măcar nu am observat Elephant, scriptul iese fără a termina, iar rularea codului din linia de comandă poate fi organizată folosind gruparea și simbolul &:

powershell -Comandă „& ($s=new-Object System.Media.SoundPlayer; $s.SoundLocation="C:/Windows/Media/tada.wav"; $s.Play(); Sleep -Seconds 9)"

UPD2 Pe baza unui număr de alte comentarii: decizia finală, desigur, poate fi astfel, ținând cont detecție automată durata fișierului și excluzând variabila $s:

powershell -Command(obiect nou Media.SoundPlayer „C:\Windows\Media\notify.wav”).playsync();
Dar cel mai important, încă nu rezolvă problema inițială - System.Media.SoundPlayer nu poate reda fișiere mp3, de exemplu. Trebuie să sculptez ceva mai complicat, dar nici nu m-am gândit că scopul acestei postări a fost să ofere o soluție la problema inițială.