- Az Out-File formázott kimenetet ír, és a folyamat végére kell kerülnie; ez szabályozza a kódolást és a szélességet.
- Az átirányítás (>, >>) az alapokban egyenértékű, de a következőben: PowerShell 7.4 megváltozott a bennszülöttekkel.
- Valós esetek: CSV-ből net felhasználóval, a következő számlálása PDF, naplók és a nyilvántartásban végrehajtott változtatások.
Amikor PowerShell-lel dolgozol, előbb-utóbb el kell mentened a kimenetedet. parancsok egy fájlban. Eredmények exportálása szövegfájlba Ez egy egyszerű módja az információk későbbi auditálásának, megosztásának vagy feldolgozásának anélkül, hogy a konzolra kellene támaszkodnia.
Ebben az útmutatóban teljes és gyakorlati áttekintést találsz arról, hogyan lehet szkripteket és parancsokat szöveggé alakítani, mindkettővel Out-File mint az átirányítási operátorok esetében, beleértve a valós példák, Trükkök kódolás, vonalvastagság és tipikus helyzetek, mint például CSV-ből való olvasás, natív parancskimenetek kezelése vagy naplóbejegyzésekMindent spanyolul magyaráznak el Spanyolországból, világos és közvetlen hangnemben.
Mit jelent az „exportálás” a PowerShellben, és hogyan illeszkedik bele az Out-* család?
A PowerShell számos olyan parancsmaggal rendelkezik, amelyeknek a műve a következő: Ki és a PowerShell-motoron kívüli célhelyekre történő kimenet küldésére szolgálnak. Fájlba, nyomtatóra vagy gazdagépre íráskor Ezek a parancsmagok objektumokat alakítanak át szöveggé, a konzol formázási rendszerét alkalmazva.
Ennek egy kulcsfontosságú következménye van: Az Out-* cmdleteknek a folyamat végére kell kerülniük.Ha például az Out-Host-ot a folyamat közepére helyezed, akkor elvágod az áramlást, és ami utána jön, az nem fog semmit fogadni. A teszt: Get-Process | Out-Host-Paging | Formátum-List nem listát fog megjeleníteni, hanem az alapértelmezett táblázatos nézetet, mivel a kimenetet már a formázás előtt elküldték a gazdagépnek.
A helyes módszer a sorrend megfordítása: Get-Process | Formátum-List | Kifelé irányuló lapozásElőször kiválasztod a formátumot, majd elküldöd a kimenetet a megfelelő célhelyre. Ugyanez vonatkozik a következőkre is: Out-File, Nyomtató o Kimenő nulla (ez utóbbi mindent eldob, amit kap, ami hasznos a nem szükséges eredmények elnémítására).
Kimenő fájl felülről lefelé: szintaxis és viselkedés
A cmdlet Out-File Konzolformázást használva fájlba írja a kimenetet. Két fő módon használhatod: normál elérési úttal (ByPath) vagy literál elérési úttal (ByLiteralPath), ha olyan speciális karaktereket használsz, amelyeket nem szeretnél, hogy a PowerShell értelmezzen.
Out-File <string> <Encoding>]
Out-File <Encoding>] -LiteralPath <string>
Ha a klasszikus átirányítást részesíti előnyben, > és >> funkcionálisan egyenértékűek az Out-File-ba történő pipe-olással extra paraméterek nélkül (kivéve az árnyalatokat), és mivel PowerShell 7.4, megváltoztatta a natív parancsok szabványos kimenetének átirányításának viselkedését. Érdemes ellenőrizni az about_Redirection oldalt. ha külső futtatható fájlokat átirányítasz a meglepetések elkerülése érdekében.
Ne feledd, hogy a Kimenő File nem ad vissza objektumokat a folyamatnak; célja szöveg mentése. Az általa kiírt reprezentáció ugyanaz, mint amit a konzolon látnánk, ezért a további feldolgozáshoz nem biztos, hogy ideális, ha először nem konvertáljuk karakterláncokká, vagy nem választunk egy által vezérelt formátumot. Formátumtábla o Formátumlista.
Kimenő fájl paramétereinek részletes magyarázata
Ahhoz, hogy a legtöbbet hozd ki az exportból, fontos jól ismerni a paramétereit. Ezek a legfontosabbak és hogyan segítenek a mindennapi életedben.
- -Fájlútvonal A kimeneti fájl elérési útját jelzi. Kötelező a ByPath készletben, és aliasokkal rendelkezik, mint például a Path. Ha a fájl nem létezik, akkor létrejön; ha létezik, akkor felülíródik, hacsak másképp nem adjuk meg.
- Amikor az útvonalakra úgy kell hivatkoznia, ahogyan azok le vannak írva, -LiteralPath a barátod. Nem fogad el helyettesítő karaktereket, és pontosan megegyezik a megadott karakterlánccal. Használd aposztrófokkal, ha vannak perjelek vagy escape karakterek.
- Con -Mellékel Tartalmat adhatsz hozzá egy meglévő fájl végéhez anélkül, hogy elveszítenéd az előző tartalmat. Tökéletes a következőkhöz: naplók vagy növekményes jelentések.
- Ha nem szeretné, hogy egy fájl véletlenül felülíródjon, -Nem Clobber blokkolja a műveletet, és egy üzenetet ad vissza, amely tisztázza, hogy a fájl már létezik, elkerülve ezzel az ijesztő eseményeket.
- Az írásvédett fájl esetén is kényszerített íráshoz: -Kényszerítés érvényteleníti az attribútumot. Vegye figyelembe, hogy ez nem kerüli meg a biztonsági korlátozásokat, csak az írásvédett jelzőt.
- Con -Szélesség A soronkénti maximális szélességet te határozod meg. A táblázatos formátumú kimenet általában a gazdagép szélességéhez igazodik; ha nem érdekel a csonkolás, állíts be nagy szélességet (pl. 2000), vagy szabályozd az értéket globálisan a következővel: $PSDefaultParameterValues = 2000.
- Nem akarsz sortörést a végére? -Nincs új sor összefűzi a kapott karakterláncokat új sorok hozzáadása nélkül, ami akkor hasznos, ha valóban érdekel a téma szövegek összekapcsolása menet közben.
- Con -InputObject Közvetlenül megadhatja az írandó objektumokat vagy karakterláncokat pipeline nélkül. Ideális előre komponált változókhoz vagy eredményekhez.
- A végrehajtás előtti kontroll érdekében, -Mi van ha Megmutatja a műveletet anélkül, hogy végrehajtaná azt (száraz teszt) és -Megerősít Előzetes megerősítést kér, ami hozzájárul biztonság automatizáláskor.
- A kódolás kulcsfontosságú. - Kódolás határozza meg a szöveg mentésének módját. Az alapértelmezett érték a utf8NoBOMTámogatja az olyan értékeket, mint az ascii, unicode (UTF-16 LE), utf8, utf8BOM, utf8NoBOM, utf32, bigendianunicode, bigendianutf32 és oem (MS-DOS vagy régebbi konzolokhoz). A PowerShell 7.4 óta használható így a kultúrád ANSI kódlapjához az azonosító manuális megadása nélkül. A 6.2-es verziótól kezdődően pedig átadhatsz numerikus kódlap-azonosítókat (pl. 1251) vagy neveket, például a „windows-1251”-et.
- Ezenkívül az Out-File támogatja a következőket: CommonParameters például a -Verbose, -ErrorAction, -Debug stb. paraméterekkel, amelyekkel homogén módon állíthatja be a diagnosztikai és hibaviselkedést.
Gyakorlati példák, amelyeket érdemes elsajátítani
Nézzük valós forgatókönyvek a leggyakoribb eseteket lefedve, mindegyiket átírva, hogy lemásolhassa és adaptálhassa őket a környezetéhez.
Hozz létre egy fájlt a folyamatok listájával és olvasd be.Ha a fájl nem létezik, akkor létrejön. Ez ideális a rendszer állapotának pillanatképének rögzítéséhez.
Get-Process | Out-File -FilePath .\Process.txt
Get-Content -Path .\Process.txt
Felülírás megakadályozása -NoClobber kapcsolóval. Ha a fájl már létezik, blokkolja a műveletet, és egy informatív hibát jelenít meg a csendes lecserélése helyett.
Get-Process | Out-File -FilePath .\Process.txt -NoClobber
Kódolás és szélesség kiválasztásaASCII formátumban ment, és minden sort 50 karakterre korlátoz (csonkít, nem tördel). Hasznos olyan eszközökkel való integrációkhoz, amelyek klasszikus formátumot várnak.
$procs = Get-Process
Out-File -FilePath .\Process.txt -InputObject $procs -Encoding ascii -Width 50
Nem fájlrendszer-szolgáltatótól írásAz Alias: meghajtón listázhatod az aliasokat, és áthelyezheted őket egy fájlba a C:\TestDir könyvtárban kontextusváltás nélkül.
Set-Location -Path Alias:
Get-ChildItem | Out-File -FilePath C:\TestDir\AliasNames.txt
Get-Content -Path C:\TestDir\AliasNames.txt
A teljes hatókör alapértelmezett szélességének beállításaHa folyamatosan generál jelentéseket, a nagy szélesség beállítása megakadályozza a csonkolást a konzolablak méretétől függetlenül.
$PSDefaultParameterValues = 2000
$logFile = "$PWD\logfile.txt"
Get-ChildItem Env:\ | Out-File $logFile
Get-Service -ErrorAction Ignore | Format-Table -AutoSize | Out-File $logFile -Append
Get-Process | Format-Table Id,SI,Name,Path,MainWindowTitle >> $logFile
$PSDefaultParameterValues.Remove('Out-File:Width')
Átirányítás CMD-ben és PowerShellben: Fontos különbségek
Ha a parancssor klasszikus esetben a kimenetet TXT-be küldheted az átirányítási operátorral. Az általános forma a következő:
Comando > C:\Ruta\archivo.txt
Például az nslookup kimenetének mentéséhez valami ilyesmit kell tennie nslookup > C:\CMD\CMD.txt és megnyitnád a fájlt az eredmény áttekintéséhez. Ez egy univerzális minta a CMD.
A PowerShellben általában a következőre kell pipe-olni: Out-File a kódolás és a szélesség finomhangolásához. Egy alapvető megközelítés a következő:
Get-Service | Out-File -FilePath C:\CMD\PowerShell.txt
Akkor azzal ellenőrizheted, Get-Content -Path C:\CMD\PowerShell.txtHa azt veszed észre, hogy a kimenet csonkolt (ami nagyon jellemző a széles táblázatokra), növeld a szélességet a -Width kapcsolóval, vagy használd a trükköt $PSDefaultParameterValues.
Amikor a kimenetnek egyetlen széles sorra kell illeszkednie, az egyik módszer a szélesség beállítása a maximálisan támogatott egész számra (2147483647), bár gyakorlati okokból a 2000 általában elég.
CSV-ből olvasás és natív parancskimenet exportálása (net user /domain)
Gyakori eset, hogy felhasználókat tartalmazó CSV-fájlt importálnak, vagy adatok kinyerése PowerShell-lel, és mindegyikre hajtsa végre a net felhasználó … /domain és a kimenetet egy TXT fájlba kell kiírni. Ha ezt egy ForEach-en belül csinálod, és minden iterációnál a -Append kapcsolóval írsz, akkor működnie kell, de néha hibák jelentkeznek, vagy csak az utolsó elem kerül kimenetre.
Egy robusztusabb forma az összesítse az összes kimenetet és csak egyszer írható, csökkentve a fájlmegnyitásokat/bezárásokat, és elkerülve a versenyhelyzeteket a natív folyamatokkal:
Import-Csv 'C:\Desktop\domain.csv' |
ForEach-Object { net user $_.Username /domain } |
Out-File -FilePath 'C:\_test\user.txt' -Append
Ha a fájl olvashatóságának javítása érdekében felhasználónként szeretné elválasztani a blokkokat, manuálisan is megadhat elválasztójeleket. Írás-kimenet segítség fejlécek vagy üres sorok hozzáadásához:
Import-Csv 'C:\Desktop\domain.csv' |
ForEach-Object {
Write-Output ("----- USUARIO: {0} -----" -f $_.Username)
net user $_.Username /domain
Write-Output ""
} | Out-File -FilePath 'C:\_test\user.txt'
Ha továbbra is furcsa viselkedést tapasztal, vannak alternatívák: Start-folyamat a -RedirectStandardOutput kapcsolóval minden felhasználónál, vagy hagyományos átirányítással >> a cmd.exe fájlból. A lényeg az, hogy a fájl ne legyen blokkolva, és hogy minden szöveg ugyanabba a fájlba kerülnek csonkítás vagy a streamek keverése nélkül.
Írjon abba a mappába, amelyből a szkript fut
Egy másik gyakori kérdés, hogy hogyan lehet mindig a saját mappába menteni. forgatókönyv vagy az aktuális mappában. Használja a $PSScriptRoot paramétert a szkript elérési útjához. (ha .ps1 fájlból futtatjuk) vagy $PWD a munkamenet aktuális munkakönyvtárához.
$destino = Join-Path $PSScriptRoot 'salida.txt'
Get-Process | Out-File -FilePath $destino
Ha a konzolba beillesztett parancsokkal futtatod, és az aktuális elérési utat szeretnéd, $PWD vagy az álnév . szolgálni fog. Az áttekinthetőség kedvéért állítsd össze az útvonalat a következővel: Join-Path és elkerülheted a bárproblémákat.
PDF oldalak számlálása és az eredmények szöveges rögzítése
Képzeld el, hogy egy könyvtárban böngészel, és egy külső eszközzel, például a következővel szeretnéd összesíteni az összes PDF oldalát: pdfinfoA lényeg az, hogy átnézzük a fájlokat, kinyerjük az „Oldalak” adatait, összegyűjtjük őket, és egy világos jelentést írjunk.
$carpeta = 'C:\PRUEBA'
$totalPaginas = 0
$contadorArchivos = 0
Get-ChildItem -Path $carpeta -Filter *.pdf | ForEach-Object {
$info = & .\pdfinfo $_.FullName | Select-String -Pattern '(?<=Pages:\s*)\d+'
$paginas = $info.Matches.Value
$totalPaginas += $paginas
$contadorArchivos++
@{
Pdf = $_.Name
Paginas = $paginas
}
} | Out-File -FilePath (Join-Path $PWD 'detalle_pdfs.txt')
("Total de páginas: {0} en {1} archivos" -f $totalPaginas, $contadorArchivos) |
Out-File -FilePath (Join-Path $PWD 'detalle_pdfs.txt') -Append
Ezzel kapsz egy soronkénti felsorolás minden PDF-ből és egy láblécből az összeggel. Ha feldolgozható formátumot szeretne, választhatja a CSV-t, de ha a célfájl egy olvasható TXT, az Out-File tökéletesen elvégzi a feladatot.
Valós eset: bejelentkezés, szűrés Select-String használatával és a beállításjegyzék szerkesztése
Egy másik nagyon hasznos forgatókönyv egy olyan szkript, amely: azonosítja az aktuális felhasználót, kereszthivatkozásokat hoz létre vele külső listákban, fájlokat tisztít, értékeket nyer ki, módosít egy beállításkulcsot, és mindent naplóba rögzít, ami történik. Bár hosszúnak tűnhet, ezek egyszerű darabok láncra verve.
A tipikus folyamat a következő lenne: rögzítse a felhasználót a whoami segítségével, normalizálja (például a domain eltávolításával), keresse meg egy Active Directory-listában a következővel: Select-String és a Set-Content paranccsal TXT formátumba mentsd a találatot. Ezután töröld az üres sorokat a következővel: Where-Object {$_.Trim() -ne »}, és helyettesítsd be a következővel: -csere hogy csak a hasznos mintát tartsuk meg.
Az első értéket ezután betöltjük a következővel: Select-Object -First 1 (Elkerüli a kétértelműségeket, ha több találat is van.) Egy második keresést hajt végre egy másik referenciafájlban, ugyanazt a tisztítást hajtja végre, és ismét az első találat marad. Ezekkel az adatokkal mostantól megtekintheti vagy exportálhatja az illetékes Nyilvántartási részleg.
Egy széles körben használt minta a régi kulcs kinyerése az ág exportálásával a következővel: normál export, keresse meg a „Felhasználói azonosító” sort a következővel: Select-String -Minta «Felhasználói azonosító», idézőjelek törlése és az előtag a következővel: -csere, és a téged érdeklő értéket tartsd meg „eredeti értékként”.
A valódi változás alkalmazásához használd Set-ItemProperty a HKEY_USERS teljes elérési útjával a profil SID-je, a "User ID" értéknév és a új adatok amit korábban már megoldottál. És ami a legfontosabb, minden, ami történik, rögzítésre kerül Írás-Kimenet … | Ki-Fájl-Hozzáfűzés egy naplóban (beleértve az időt, a felhasználót, a SID-t, a régi és az új értéket stb.).
$hora = Get-Date
"Hora: $hora ; Usuario: $usuario ; ClaveOriginal: $valorOld ; NuevaClave: $valor ; SID: $sid" |
Out-File -FilePath "\\SERVIDOR\RUTA\usuarios.log" -Append
A tiszta leállításhoz törölje az ideiglenes fájlokat a következővel: Elem eltávolításaEgy biztonsági részlet: Kimenő fájl - Hozzáfűzés következetesen olvasható előzményeket vezet, ami aranyat ér a későbbi ellenőrzések során, ha valami rosszul sül el.
Out-Host, Out-Null és Out-Printer: Mikor számítanak és mikor nem
Már utaltunk rá: Külső host Alapvetően a parancsot a gazdagépnek (a konzolablaknak) küldi. Fő hasznossága a lapozás a hosszú listákban a -Paging kapcsolóval, mindig a folyamat végére helyezve, hogy ne szakítsa meg a láncot.
Kimenő nulla Ez a nyelő. Minden, ami bele kerül, azonnal eldobásra kerül. Mellékhatásokkal járó parancsokhoz használják, amikor a kimenet nem ad hozzá értéket. Ne feledd, hogy nem szünteti meg a hibákat: Ha a rendelés nem létezik vagy sikertelen, akkor is látni fogja az üzenetet.
Ha szüksége van rá nyomtatás-On Windows Van egy Out-Printer nyomtatód. A kimenetet elküldheted az alapértelmezett nyomtatóra, vagy megadhatod a megjelenítendő nevét (mint egy nyomtatóillesztőt a fájlba), és a PowerShell gondoskodik a többiről.
Finomhangolás: formátum, ANSI és szélesség meglepetések nélkül
Mivel az Out-File formátumok ugyanazt a rendszert használják, mint a konzol, az eredmény néha csonkolt lehet. Szabályozza a szélességet A -Width vagy a globális alapértelmezett érték használatával elkerülhetők ezek a problémák széles táblák mentésekor.
-tól PowerShell 7.2 Az ANSI escape szekvenciák kezelését a következőképpen szabályozhatja: $PSStyle.OutputRenderingHa a kimenet színt vagy egyéb díszítéseket tartalmaz, és ezt a viselkedést exportáláskor meg szeretné tartani vagy letiltani, akkor a fájlba írás előtt állítsa be ezt a beállítást.
Olyan változatokban, mint Windows PowerShell 5.1Az Out-File alapértelmezett formátuma az Unicode volt. Ma, a modern PowerShell-lel, az alapértelmezett formátum ez utf8NoBOM, ami általában a legkompatibilisebb. Ha egy régebbi eszköz ragaszkodik az ASCII kódoláshoz, jelezze ezt a -Encoding ascii kapcsolóval. Ha pedig a helyi kultúrából származó eszközökkel dolgozik, így (a 7.4-es verzió óta) egy kényelmes gyorsbillentyű.
Gyors tippek a bevált gyakorlatokhoz
Amikor csak tudsz, válaszd a Kimenő fájlt az Átirányítás helyett Ha egy meglévő fájl kódolását, szélességét vagy viselkedését kell szabályoznia. Az átirányítás gyors, de kevésbé explicit, és a natív verziókkal való viselkedése megváltozott a 7.4-es verzióban.
Amikor egy ciklus alatt ismételten írsz, rangsorold a dolgokat gyűjtsd össze és írd le csak egyszer vagy ha iterációval kell írnod, használd az -Append kapcsolót, és kerüld el több célhely párhuzamos keverését, amelyek ugyanarra a fájlra versenyezhetnek.
Ha a szkriptet külön mappába kell menteni, használja a következőt: $PSScriptRootHa interaktív munkamenetről van szó, akkor $PWD. Join-Path megvédi magát az elválasztási hibáktól és javítja a hordozhatóságot.
Amikor a cél az utófeldolgozásFormázott szöveg helyett érdemes lehet az Export-CSV vagy a ConvertTo-Json fájlokat használni. Ha az emberi olvashatóság a legfontosabb (jelentések, naplók), az Out-File tökéletes választás.
Ritka, speciális karaktereket tartalmazó útvonalak esetén, -LiteralPath Fejfájást takarít meg. És ne feledd, hogy az Out-File nem adja vissza a kimenetet a folyamatba: ha ki kell nyomtatnod és mentened is, használd a Tee-Object a folyamatok megkettőzéséhez.
Ha táblázatos jelentéseket készít, vegye figyelembe a következőket: formátum magaddal Formátumtábla o Formátumlista írás előtt. A formátum előzetes szabályozása stabilabb eredményeket eredményez, és elkerüli a konzol szélességétől való függőséget.
A gyakori cmdlet-ökoszisztéma (-Verbose, -ErrorAction stb.) itt is érvényes. Aktív - Részletes tesztelés közben, hogy lásd, mi történik, és tiltsd le éles környezetben, ha nem szeretnél zajt.
Ez a túra egy áttekinthető térképet ad a kezedbe: Out-File és a vállalat fájlokká, nyomtatókká vagy magában a konzolban materializálódik, ami korábban objektum volt. A megfelelő kombinációval Helyes csővezeték-kódolás, szélesség és sorrend, jelentései és naplói megbízhatóak, olvashatók és megosztásra vagy archiválásra készek lesznek.
Szenvedélyes író a bájtok és általában a technológia világáról. Szeretem megosztani tudásomat írásban, és ezt fogom tenni ebben a blogban, megmutatom a legérdekesebb dolgokat a kütyükről, szoftverekről, hardverekről, technológiai trendekről stb. Célom, hogy egyszerű és szórakoztató módon segítsek eligazodni a digitális világban.
