ค้นหาและแทนที่ข้อความผ่านไฟล์แบตช์


0

ฉันได้เห็นคำถามนี้ถาม แต่ไม่เคยมีคำตอบที่เหมาะสมสำหรับสิ่งที่ฉันต้องการ

ฉันทำงานด้วยการสนับสนุนเทคโนโลยีระยะไกลในระบบคอมพิวเตอร์และสิ่งหนึ่งที่ฉันต้องทำบ่อยๆคือเปิดไฟล์ ini และแทนที่บรรทัดใหม่ด้วยบรรทัดใหม่

เป็นตัวอย่างที่เราจะพูด

program.ini

สถานะโปรแกรม = ลูกค้า

ฉันจะต้องเปลี่ยนเซิร์ฟเวอร์เป็นเซิร์ฟเวอร์เพื่ออ่าน

สถานะโปรแกรม = เซิร์ฟเวอร์

ในขณะที่ใช่ฉันสามารถเปิดใน notepad ฉันต้องการที่จะสามารถทำได้ผ่านทางบรรทัดคำสั่งในไฟล์แบทช์เพราะฉันมีเครื่องมือแบทช์ที่ฉันได้สร้างขึ้นสำหรับทุกสิ่งที่ฉันทำ

ตอนนี้โปรดทราบว่าคอมพิวเตอร์ทุกเครื่องไม่รองรับสคริปต์ PowerShell ดังนั้นจึงต้องอยู่ในไฟล์แบตช์เดียว ฉันไม่สามารถดาวน์โหลดซอฟต์แวร์เพิ่มเติมใด ๆ ได้เนื่องจากนี่ไม่ใช่ระบบที่ฉันเชื่อมต่ออยู่

ใคร ๆ ก็รู้ว่าจะต้องทำอย่างไรอย่างหมดจดผ่านแบทช์ในขณะที่ฉันกำลังขาดทุน ไม่ต้องการเปิดโปรแกรมแก้ไขผ่านบรรทัดคำสั่งเพียงแค่เรียกใช้งานทันทีและบรรทัดนั้นจะเปลี่ยนไปในไฟล์ ini

ขอบคุณสำหรับการป้อนข้อมูลใด ๆ -Terra


บรรทัดที่แก้ไขต้องอยู่ในลำดับหรือไม่ เราสามารถสมมติ VBScript และ cscript ได้หรือไม่?
harrymc

ใช่มันเป็นไอนิที่มีมากกว่า 100 บรรทัดและต้องอยู่ในระเบียบ และตามที่ระบุไว้ไม่สามารถรวมไฟล์เพิ่มเติมการติดตั้งหรือดาวน์โหลดได้ หาวิธีในคำสั่งบรรทัดคำสั่งบริสุทธิ์ในสคริปต์ชุด ฉันคุ้นเคยกับ linux ทุบตีและยังคงเรียนรู้สิ่งนี้สำหรับ windows ดังนั้นแก้ไขให้ถูกต้องหากฉันทำผิด แต่ VBScript หรือ cScript ไม่ต้องการไฟล์เพิ่มเติมหรือไม่
Terra Envy

1) เมื่อคุณเพิ่มข้อมูลเพิ่มเติมเพื่อตอบความคิดเห็นโปรดคลิกแก้ไขและเพิ่มลงในคำถามเดิมของคุณดังนั้นคำถามจะมีข้อมูลทั้งหมดที่จำเป็นในการอธิบายปัญหา จากนั้นลบความคิดเห็นโดยคลิกที่สีเทา (S) ท้ายสุดสำหรับความคิดเห็นสามารถซ้อนกันได้และเมื่อพวกเขาทำความคิดเห็นบางส่วนจะถูกซ่อนไว้
K7AAY

ไม่มีข้อความค้นหาดั้งเดิมและแทนที่ยกย่องใน Windows 2) สำหรับพีซีที่มี PowerShell คุณสามารถเขียนสคริปต์คำสั่ง w / a เช่นcat program.ini | % {$ <underscore> -replace "สถานะโปรแกรม = ลูกค้า", "สถานะโปรแกรม = เซิร์ฟเวอร์"} (แทนที่ <underscore> w / ตัวอักษรขีดล่างจริง
K7AAY

3) สำหรับเครื่องคอมพิวเตอร์ w / ไม่มี PowerShell, แนะนำให้เพิ่มมาเปิดsedและพึ่งพาgnuwin32.sourceforge.net/packages/sed.htmไปยังไดเรกทอรีชั่วคราว (ดังนั้นเพื่อหลีกเลี่ยงการติดตั้งหรือเปลี่ยนแปลงไปยังรีจิสทรี) เรียกใช้สคริปต์ sed ในการที่ ไดเรกทอรีสำหรับงานจากนั้นล้างมัน & การอ้างอิงเป็นสิ่งสุดท้ายที่คุณทำ 4) อีกทางเลือกหนึ่งคือ Open Source FreeDOS edlin en.wikipedia.org/wiki/Edlin#Scriptsมันทำงานใน Windows 10 x64 & x32 และ Windows รุ่นก่อนหน้า มันช่วยให้ค้นหาข้อความได้ง่ายและแทนที่สคริปต์ sourceforge.net/projects/freedos-edlin/files/latest/download
K7AAY

คำตอบ:


2

ไฟล์แบตช์นี้มีข้อมูลการวินิจฉัยบางอย่างเช่นกัน บรรทัด setlocal จำเป็นต้องมีเพื่อให้สามารถเล่นกับตัวแปรในลูปได้อย่างถูกต้อง

ผลข้างเคียงที่สำคัญที่สุดของการใช้วิธีนี้คือการลบบรรทัดว่าง (โดยพวกเขาจะถูกละเว้นโดย FOR) และการทดสอบของคุณ (ในส่วน "เขียนค่าใหม่") นั้นเฉพาะเจาะจงมาก: ช่องว่างและเรื่องเล็ก ๆ น้อย ๆ คุณสามารถดำเนินการจับคู่ตัวพิมพ์เล็กและใหญ่กับ / i แต่เนื่องจากคุณรวมช่องว่างในคำถามของคุณฉันจึงสงสัยว่าคุณต้องการรวมไว้ด้วย คุณจะต้องรวมหลายบรรทัดตามที่ทำในส่วนนั้นเพื่อทำซ้ำการเปรียบเทียบที่เป็นไปได้แต่ละรายการ

@ECHO OFF
setlocal enableDelayedExpansion

FOR /F "tokens=1,* delims==" %%i IN (test.ini) DO (
    SET sdone=0
    SET "sname=%%i"
    SET "svalue=%%j"
    ECHO.Name:  !sname!
    ECHO.Value: !svalue!

    :: write out headers
    IF "!sdone!"=="0" IF "!sname:~0,1!"=="[" SET sdone=1&&ECHO.Type:  Header&&ECHO.!sname!>>new.ini

    :: write out the new value if it's client
    IF "!sdone!"=="0" IF "!sname!"=="program status" IF "!svalue!"=="client" SET sdone=1&&ECHO.Type:  Rewrite&&ECHO.!sname!=server>>new.ini
    IF "!sdone!"=="0" IF "!sname!"=="program status " IF "!svalue!"==" client" SET sdone=1&&ECHO.Type:  Rewrite&&ECHO.!sname!=server>>new.ini

    :: write out anything else
    IF "!sdone!"=="0" SET sdone=1&&ECHO.Type:  Content&&ECHO.!sname!=!svalue!>>new.ini

    :: a little padding to read the debug info
    ECHO.
)

ในตอนท้ายคุณจะต้องเพิ่มสิ่งที่จะเขียนทับไฟล์ต้นฉบับเช่น:

copy /y new.ini test.ini

ไม่มีช่องว่างใน INI ดังนั้นนี่จึงทำงานได้อย่างสมบูรณ์แบบตามที่ฉันต้องการ ขอบคุณมากสำหรับคำตอบของคุณ
Terra Envy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.