คำสั่งแบบสัมผัสซ้ำของ Windows


17

ใน Windows 7 ฉันจะสัมผัสไฟล์ทั้งหมดซ้ำในไดเรกทอรี (รวมถึงไดเรกทอรีย่อย) ซ้ำเพื่ออัปเดตวันที่ / เวลาได้อย่างไร

Windows 7 มีกลไกในการทำสิ่งนี้หรือไม่?



คำตอบ "ยอมรับ" ในลิงค์นั้นเกี่ยวกับการใช้. NET programming libraries เพื่อให้สำเร็จสำหรับหนึ่งไฟล์ คนอื่น ๆ เกี่ยวกับการเพิ่มเมนูบริบทเพื่ออัปเดตไฟล์เดียว ฉันกำลังมองหาคำสั่งในตัวที่จะทำกับไฟล์ N แบบวนซ้ำ คำตอบด้านล่างนี้ใช้สำหรับไฟล์ทั้งหมด มันไม่ใช่ในตัว แต่ใช้งานได้ ขอบคุณ
jmq

มันไม่ใช่คำสั่ง Unix เวอร์ชัน Windows ที่ซ้ำกันเช่นกันเนื่องจากคำถามนี้ถามถึงการสอบถามซ้ำโดยเฉพาะ อย่างไรก็ตามโปรดทราบว่าคำตอบสำหรับคำถามนั้นมีรูปแบบเรียกซ้ำ
JdeBP

คำตอบ:


19

มีความเป็นไปได้หลายอย่าง:

  • ใช้พอร์ตของtouchคำสั่งUnix และรวมเข้าด้วยกันfindและtouchใช้วิธี Unix มีหลายทางเลือก ผู้ทรงกล่าวถึงเป็นGnuWin32 , CygwinและUnxUtils เป็นที่รู้จักกันน้อย แต่ในบางวิธีดีกว่าคือเครื่องมือในชุดเครื่องมืออรรถประโยชน์ SFUAซึ่งทำงานในระบบย่อยสำหรับแอพพลิเคชั่นที่ใช้ระบบปฏิบัติการ UNIXซึ่งมาในกล่องพร้อมกับ Windows 7 Ultimate edition และ Windows Server 2008 R2 (สำหรับ Windows XP สามารถดาวน์โหลดและติดตั้งบริการสำหรับ UNIX เวอร์ชัน 3.5ได้) ชุดเครื่องมือนี้มีเครื่องมือ TUI บรรทัดคำสั่งจำนวนมากจากmvและduถึง Korn และ C เชลล์perlawkและ มันมาในทั้งรสชาติ x86-64 และ IA64 เช่นเดียวกับ x86-32 โปรแกรมทำงานในสภาพแวดล้อม POSIX ที่เหมาะสมของ Windows แทนที่จะใช้ emulator DLLs (เช่นcygwin1.dll) การวางซ้อนสิ่งต่าง ๆ บน Win32 และใช่ชุดเครื่องมือมีtouchและfindเช่นเดียวกับคนอื่น ๆ อีก 300 คน
    ชุดเครื่องมือเหล่านี้ทั้งหมดมีข้อเสียที่รู้จักกันดีในการรันกระบวนการแยกต่างหากสำหรับทุกไฟล์ที่ต้องถูกสัมผัสแน่นอน นั่นไม่ใช่ปัญหากับทางเลือกต่อไปนี้

  • ใช้touchคำสั่งWin32 ดั้งเดิมอย่างใดอย่างหนึ่งที่ผู้คนได้เขียนและเผยแพร่ หลายคนสนับสนุนตัวเลือกในการเรียกซ้ำโดยไม่จำเป็นต้องใช้ Unix findเพื่อล้อมรอบพวกเขา (พวกเขาทั้งหมดกำหนดเป้าหมายไปยังฐานผู้ใช้ที่กำลังมองหาtouchคำสั่งเพราะมันไม่ได้โหลดคำสั่ง Unix ที่พอร์ตทั้งหมด) หนึ่งในนั้นคือStéphane Duguaytouchซึ่งคุณสามารถเห็น--recursiveตัวเลือกได้

  • ทำความเข้าใจกับความลึกลับที่ลึกลับของ CMD ดังที่กล่าวไว้ในคำตอบอื่น ๆCOPY /B myfile+,,จะอัปเดตล่าสุดของการแก้ไขไฟล์โดยใช้ไวยากรณ์ "plus" ที่รู้จักกันน้อยของCOPYคำสั่ง (ซึ่งสามารถพบได้ที่นี่โดยบังเอิญ) หลักสูตรนี้สามารถใช้ร่วมกับFOR /Rการดำเนินการแบบเรียกซ้ำได้ตามคำแนะนำในคำตอบอื่นที่นี่

  • ใช้ล่ามคำสั่งการแทนที่และฉลาดน้อยกว่าและตรงไปตรงมามากกว่า CMD TCC / LE ของ JP Softwareเป็นเช่นนั้น มันจะเพิ่ม/SตัวเลือกในการของCOPYคำสั่งซึ่งหมายความว่าสามารถใช้COPY /Sกับ "บวก" ไวยากรณ์ที่จะขจัดความจำเป็นในการที่FORเสื้อคลุม แต่นั่นก็ยังทำให้ชีวิตตัวเองลำบากโดยไม่จำเป็นเนื่องจาก TCC / LE มีคำสั่ง TOUCH ในตัวที่รองรับ/Sตัวเลือกโดยตรง


2
+1 COPY /B file+,,วิธีที่จะไปไม่ต้องใช้บริการพิเศษ ... :-)
Tamara Wijsman

3
ทาง Powershell:(ls file).LastWriteTime = DateTime.now
Tamara Wijsman

5

เนื่องจากพวกเขามีพร้อมฉันอยากจะแนะนำการใช้ประโยชน์จากUnxUtils พวกเขารวมถึงfindและtouchคำสั่งที่จะทำให้ง่ายมาก

หลังจากเปลี่ยนเป็นไดเรกทอรีสูงสุดคุณต้องการแก้ไข:

หา -type f -exec touch {} +

5

หากต้องการใช้ฟังก์ชันการทำงานของ Windows ที่มีอยู่เท่านั้น (ไม่มีอะไรพิเศษให้ติดตั้ง) ลองทำสิ่งใดสิ่งหนึ่งต่อไปนี้:

forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"  

(เรียกซ้ำ "สัมผัส" ไฟล์ทั้งหมดที่เริ่มต้นในเส้นทางที่ระบุ)

หรือ

forfiles /S /C "cmd /c Copy /B @path+,,"   

(เรียกซ้ำ "สัมผัส" ไฟล์ทั้งหมดที่เริ่มต้นในไดเรกทอรีปัจจุบัน)


3
-1 As- คือคำสั่งเหล่านี้คัดลอกไฟล์จากโฟลเดอร์ย่อยไปยังรูทและผลลัพธ์เป็นระเบียบ
TonyG

1
+1 บิดเล็กน้อยเพื่อแก้ไขสิ่งที่ @TonyG พูดว่า: forfiles / S / C "cmd / c Copy / B nul: + ,,"
Alex Dupuis

ไม่เปลี่ยนแปลงแก้ไขล่าสุด
beppe9000

4

ฉันรู้ว่านี่อาจจะสายเกินไป แต่ฉันจะทิ้งคำตอบไว้ในกรณีที่คนอื่นต้องการสิ่งเดียวกัน

คำตอบของ John T ไม่ได้ผลสำหรับฉันใน Windows 7 หลังจากการวิจัยบางอย่างฉันพบอรรถประโยชน์นี้ชื่อSKTimeStampซึ่งทำงานได้อย่างสมบูรณ์แบบ

นี่คือบทความที่มีรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงาน: http://www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -accessed /

นี่คือขั้นตอนที่คุณต้องดำเนินการ:

  • ติดตั้งแอปพลิเคชัน
  • ไปที่ไดเรกทอรีที่คุณต้องการเปลี่ยนการประทับเวลา
  • ค้นหา * ในช่องค้นหาเพื่อให้ explorer แสดงไฟล์ทั้งหมด
  • เมื่อพบไฟล์ทั้งหมดให้เลือกทั้งหมดคลิกขวาแล้วเลือก Properties
  • ในบทสนทนาให้เลือกแท็บ TimeStamps
  • ปรับวันที่และเวลาของคุณตามต้องการและคลิกที่แตะ

Voila! อัปเดตไฟล์ทั้งหมดของคุณแล้ว! ไม่จำเป็นต้องใช้ utiles หรือบรรทัดคำสั่งใด ๆ


1

หรือคุณสามารถใช้เครื่องมือที่มีอยู่แล้วใน Windows เมื่อคุณมีเครื่องมือ "สัมผัส" อยู่แล้ว:

for /r %i in (C:\Path\To\Root\*) do @touch "%i"

หรือ

forfiles /P C:\Path\To\Root /S /C "touch @file"

(หมายเหตุ: หากคุณทำเช่นนี้จากแบตช์ไฟล์และต้องการใช้forคำสั่งตรวจสอบให้แน่ใจว่าได้ใช้เครื่องหมายสองเปอร์เซ็นต์สำหรับตัวแปรของคุณ (เช่น%%iแทน%i)


1

มันล้มเหลวใน Windows 7 สำหรับฉันด้วย ฉันใช้ไวยากรณ์ที่แตกต่างกันและทำให้การทำงาน:

forfiles /c "cmd /c touch @file"

หมายเหตุฉันไม่ได้ใช้ตัวเลือกการเรียกคืนเงิน


1

ใช้ PowerShell:

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date

สิ่งนี้ไม่ได้ผลสำหรับฉัน:The property 'LastWriteTime' cannot be found on this object.
เบ็น N

มันทำงานได้ดีสำหรับฉันใน Windows Server 2012: (ls. \ backup_db_20150810.sql) .LastWriteTime = Get-Date
ThiagoAlves

0

จากการอ้างอิงถึงคำตอบของ John T ด้านบน:

ฉันพยายามที่จะเข้าใจความแตกต่างระหว่างการสิ้นสุดfindคำสั่ง exec กับ a \;และ `+ '(ฉันไม่ทราบหลัง)

สิ่งนี้มีประโยชน์: (จากที่นี่ )

-exec command ;
ดำเนินการคำสั่ง; เป็นจริงถ้าส่งคืนสถานะ 0 อาร์กิวเมนต์ทั้งหมดต่อไปนี้เพื่อค้นหาจะถูกนำไปเป็นอาร์กิวเมนต์กับคำสั่งจนกว่าอาร์กิวเมนต์ประกอบด้วย ';' พบ สตริง '{}' ถูกแทนที่ด้วยชื่อไฟล์ปัจจุบันที่ถูกประมวลผลทุกที่ที่เกิดขึ้นในอาร์กิวเมนต์ของคำสั่งไม่ใช่เฉพาะในอาร์กิวเมนต์ที่อยู่คนเดียวเช่นเดียวกับในบางรุ่นของการค้นหา

-exec command {} +
ตัวแปรของแอ็คชัน -exec นี้รันคำสั่งที่ระบุบนไฟล์ที่เลือก แต่บรรทัดคำสั่งถูกสร้างโดยการต่อท้ายชื่อไฟล์ที่เลือกแต่ละชื่อที่ท้าย จำนวนการเรียกใช้คำสั่งทั้งหมดจะน้อยกว่าจำนวนไฟล์ที่ตรงกัน บรรทัดคำสั่งถูกสร้างขึ้นในลักษณะเดียวกับที่ xargs สร้างบรรทัดคำสั่ง อนุญาตเพียงหนึ่งอินสแตนซ์ของ '{}' ภายในคำสั่ง คำสั่งจะถูกดำเนินการในไดเรกทอรีเริ่มต้น

พิจารณาโฟลเดอร์c:\myfolderที่มี 2 ไฟล์a.txtและb.txt

  1. find . -type f -exec touch {} +ถูกตีความว่าเป็น:
    touch a.txt b.txt
    สิ่งนี้คล้ายกับวิธีการทำงานของ xargs

  2. ในขณะที่find . -type f -exec touch {} \;ตีความว่า:
    touch a.txt
    touch b.txt

ดังนั้น # 1 จะเร็วกว่ามาก (แต่ยังต้องทนทุกข์ทรมานจากข้อ จำกัด ที่คำสั่งต่อไปนี้execสามารถมี{}ตัวยึดตำแหน่งเดียวเท่านั้น)


ความคิดเห็นที่ดีพร้อมข้อมูลที่ดี แต่ไม่ใช่คำตอบสำหรับคำถาม จะมี +1 หากนี่เป็นความคิดเห็น
TonyG

1
:) ฉันไม่มีความทรงจำเกี่ยวกับการทำโพสต์นี้ :)
Ashutosh Jindal

0

การใช้ PowerShell สำหรับไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยทั้งหมด:

dir -R | foreach { $_.LastWriteTime = [System.DateTime]::Now }

dirหรือคุณสามารถระบุโฟลเดอร์ขวาหลังจาก

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