मैं PowerShell में दो पाठ फ़ाइलों को कैसे संक्षिप्त करूं?


108

मैं catयूनिक्स में कमांड की कार्यक्षमता को दोहराने की कोशिश कर रहा हूं ।

मैं उन समाधानों से बचना चाहूंगा, जहां मैं स्पष्ट रूप से दोनों फाइलों को चर में पढ़ता हूं, चर को एक साथ मिलाता हूं, और फिर संक्षिप्त चर को लिखता हूं।

जवाबों:


170

आप बस उपयोग कर सकते हैं cat example1.txt, example2.txt | sc examples.txt। आप निश्चित रूप से इस शैली के साथ दो से अधिक फ़ाइलों को संक्षिप्त कर सकते हैं, भी। इसके अलावा, यदि फ़ाइलें समान नाम की हैं, तो आप उपयोग कर सकते हैं:

cat example*.txt | sc allexamples.txt

के catलिए एक उपनाम है Get-Content, और के scलिए एक उपनाम है Set-Content

नोट 1 : बाद के तरीके से सावधान रहें - यदि आप examples.txt(या पैटर्न से मिलते-जुलते हैं) आउटपुट की कोशिश करते हैं , तो पावरशेल एक अनंत लूप में आ जाएगी! (मैंने अभी यह परीक्षण किया है)।

नोट 2 : किसी फाइल में आउटपुट के साथ >कैरेक्टर एन्कोडिंग को संरक्षित नहीं करता है! यही कारण है कि उपयोग Set-Content( sc) की सिफारिश की है।


5
बस के मामले में किसी को पाने के लिए फाइलों पर iterate करना चाहता है- ChildItems | Foreach-Object निर्माण आप सेट-सामग्री के बजाय ऐड-कंटेंट का उपयोग करना चाह सकते हैं। अन्यथा प्रत्येक पुनरावृत्ति में लक्ष्य फ़ाइल अधिलेखित हो जाती है।
जोनास

1
ध्यान दें कि डिफ़ॉल्ट रूप से Set-Contentराष्ट्रीय कोड पेज का उपयोग करता है (जैसे अंग्रेजी के लिए विंडोज -1252)। यदि स्रोत फ़ाइलों में अन्य कोडिंग शामिल हैं (जैसे Windows-1251 या UTF8), तो आपको सही एन्कोडिंग सेट करना होगा sc file.txt -Encoding UTF8(रूसी के लिए 1251 जैसे नंबर v6.2 के बाद से समर्थित हैं)
Radek Pech

@ जोनास के साथ समस्या Add-Contentयह है कि यदि आप दो बार कमांड चलाते हैं, तो एग्रीगेटेड फाइल दो बार लंबी होती है। एक अच्छा प्रतिस्थापन है Out-Fileयहाँ
Dan Friedman

1
काम करने के लिए प्रतीत नहीं होता है अगर फाइलें बाइनरी हैं (उदाहरण के लिए, मेरे मामले में एक ज़िपफाइल के हिस्से)।
डैनियल लिडस्ट्रॉम

1
@ डैनियल लिस्ट्रम यह बायनेरिज़ के लिए सही मापदंडों के साथ भी काम करता है: टाइमस्टैम्प Get-Content my.bin -Raw | Set-Content my.bin -NoNewlineको my.binछोड़कर नहीं बदलेगा । -Rawकिसी भी CR / LF बाइट को सुरक्षित रखता है, जबकि -NoNewlinePowerShell को अपने CR / LF बाइट को जोड़ने से रोकता है।
थॉमस

62

उपयोग न करें >; यह चरित्र एन्कोडिंग को गड़बड़ करता है। उपयोग:

Get-Content files.* | Set-Content newfile.file

catके लिए एक उपनाम है Get-Content
n0rd

5
@ n0rd मुझे लगता है कि यह "पाइप लाइन का उपयोग करने के बजाय" चीज का अधिक था।
कोसो

पुष्टि कर सकते हैं। उपयोग करते समय मेरी संक्षिप्त फ़ाइल की शुरुआत में ÿþहै जो मिल रहा था । FF FE>
गपरलैंड

16

में cmd, आप यह कर सकते हैं:

copy one.txt+two.txt+three.txt four.txt

PowerShell में यह होगा:

cmd /c copy one.txt+two.txt+three.txt four.txt

जबकि PowerShell तरीका gc का उपयोग करना होगा , ऊपर विशेष रूप से बड़ी फ़ाइलों के लिए, बहुत तेज़ होगा। और इसका उपयोग गैर- ASCII फाइलों पर भी /Bस्विच का उपयोग करके किया जा सकता है ।


3
मेरे लिए कैट कमांड cmd / c कमांड (जो वास्तव में त्वरित चलता है) की तुलना में अधिक समय तक परिमाण के कई आदेश चलाता है; विकल्प को इंगित करने के लिए धन्यवाद!
रॉब

यह सबसे अच्छा जवाब है।
निकोलस डिपियाज़ा

12

आप ऐड-कंटेंट cmdlet का उपयोग कर सकते हैं । शायद यह अन्य समाधानों की तुलना में थोड़ा तेज़ है, क्योंकि मैं पहली फ़ाइल की सामग्री को पुनर्प्राप्त नहीं करता हूं।

gc .\file2.txt| Add-Content -Path .\file1.txt

क्या gcसंदर्भित करता है?
ऑक्टोपसग्राबस

gcGet-Content
MM के

8

कमांड प्रॉम्प्ट में फ़ाइलों को संक्षिप्त करने के लिए यह होगा

type file1.txt file2.txt file3.txt > files.txt

PowerShell typeकमांड को कनवर्ट करता है Get-Content, जिसका अर्थ है कि typePowerShell में कमांड का उपयोग करते समय आपको एक त्रुटि मिलेगी क्योंकि Get-Contentकमांड को फ़ाइलों को अलग करने के लिए अल्पविराम की आवश्यकता होती है। PowerShell में एक ही कमांड होगा

Get-Content file1.txt,file2.txt,file3.txt | Set-Content files.txt

5

यदि आपको विशिष्ट पैरामीटर द्वारा फ़ाइलों को ऑर्डर करने की आवश्यकता है (जैसे दिनांक समय):

gci *.log | sort LastWriteTime | % {$(Get-Content $_)} | Set-Content result.log

3

मैंनें इस्तेमाल किया:

Get-Content c:\FileToAppend_*.log | Out-File -FilePath C:\DestinationFile.log 
-Encoding ASCII -Append

यह ठीक है। मैंने जोड़ा कि ASCII एन्कोडिंग को हटाने के लिए nul वर्ण नोटपैड ++ स्पष्ट एन्कोडिंग के बिना दिखा रहा था।


2

आप कुछ ऐसा कर सकते हैं:

get-content input_file1 > output_file
get-content input_file2 >> output_file

जहां >"आउट-फाइल" के लिए एक उपनाम है, और >> "आउट-फाइल-टैपेंड" के लिए एक उपनाम है।


2

चूंकि अधिकांश अन्य उत्तरों में अक्सर प्रारूपण गलत हो जाता है (पाइपिंग के कारण), सबसे सुरक्षित काम इस प्रकार है:

add-content $YourMasterFile -value (get-content $SomeAdditionalFile)

मुझे पता है कि आप $ SomeAdditionalFile की सामग्री को एक चर में पढ़ने से बचना चाहते थे, लेकिन उदाहरण के लिए आपके न्यूलाइन फॉर्मेटिंग को बचाने के लिए मुझे नहीं लगता कि इसके बिना करने का उचित तरीका है।

एक वर्कअराउंड आपके $ SomeAdditionalFile लाइन के माध्यम से लाइन और पाइपिंग द्वारा आपके $ YourMasterFile में लूप होगा। हालाँकि यह अत्यधिक संसाधन गहन है।


1

एन्कोडिंग और लाइन अंत रखने के लिए:

Get-Content files.* -Raw | Set-Content newfile.file -NoNewline

नोट: AFAIR, जिनके पैरामीटर पुराने पॉवर्सशेल्स द्वारा समर्थित नहीं हैं (<3? <4?)


0

मुझे लगता है कि "शक्तियां रास्ता" हो सकता है:

set-content destination.log -value (get-content c:\FileToAppend_*.log )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.