เทียบเท่ากับ Linux `touch 'เพื่อสร้างไฟล์เปล่าด้วย PowerShell [ซ้ำ]


167

คำถามนี้มีคำตอบอยู่ที่นี่แล้ว:

ใน PowerShell มีค่าเทียบเท่าtouchหรือไม่

เช่นใน Linux ฉันสามารถสร้างไฟล์ว่างใหม่โดยการเรียก:

touch filename

ใน Windows นี่มันค่อนข้างงุ่มง่าม - โดยปกติฉันเพิ่งเปิดตัวอย่างใหม่ของ notepad และบันทึกไฟล์เปล่า

ดังนั้นมีวิธีการเขียนโปรแกรมใน PowerShell ทำเช่นนี้?

ฉันไม่ได้ต้องการจับคู่พฤติกรรมการสัมผัสอย่างถ่องแท้ แต่เพื่อค้นหาสิ่งที่เทียบเท่าได้ง่ายที่สุดสำหรับการสร้างไฟล์เปล่า



ขอบคุณ ฉันดูพวกเขา แต่คำตอบส่วนใหญ่มุ่งเน้นไปที่ command-prompt ฉันต้องการโซลูชัน PowerShell ที่ไม่ต้องการให้ฉันติดตั้งแอปพลิเคชันใหม่
jsalonen

Downvote คำถาม - คุณสมบัติทั้งสองเป็นเพียงไม่กี่บรรทัดของรหัสเพียงใช้ทั้งสองไม่เพียงครึ่งหนึ่ง esp เมื่อคำสั่งครึ่งอื่นที่ขาดหายไปนั้นอันตรายมาก
yzorg

@yzorg: คุณหมายถึงอะไรทั้งสองคุณสมบัติ? ฉันแค่ถามว่าจะสร้างไฟล์เปล่าใน PS ได้อย่างไรtouchใน Linux
jsalonen

@jsalonen ใช้ * ระวังtouchในไฟล์ที่มีอยู่ซึ่งจะอัปเดตครั้งล่าสุดในการเขียนโดยไม่ต้องแก้ไขไฟล์ดูลิงก์จาก @amiregelz คำถามนี้มีการจัดอันดับ google สูงสำหรับpowershell touchฉันต้องการแจ้งเตือนคัดลอก / วาง -ers ที่ครึ่งนี้เท่านั้นที่สามารถทำลายข้อมูลเมื่อ * ระวังไม่ได้ ดู @LittleBoyLost คำตอบที่จัดการเมื่อไฟล์มีอยู่แล้ว
yzorg

คำตอบ:


165

การใช้ตัวเปลี่ยนเส้นทางผนวก ">>" จะช่วยแก้ไขปัญหาที่ไฟล์ที่มีอยู่ถูกลบ:

echo $null >> filename

3
หรือที่เรียกว่า 'echo null> filename' จากพรอมต์คำสั่งอาจเป็นไฟล์แบตช์ เยี่ยมมากที่จะเห็นรุ่น PowerShell ขอบคุณ!
Mark Allen

16
สัมผัสค่อนข้างแตกต่างกว่านี้ถ้าไฟล์มีอยู่แล้ว
jk

9
เสียงสะท้อนนั้นไม่จำเป็นใช้$null > filenameงานได้ดี
alirobe

8
นี่เขียน Unicode BOM 0xFEFF 2 ไบต์ให้ฉัน
mlt

4
หมายเหตุสำคัญ: เครื่องมือ unix จำนวนมากไม่ได้จัดการกับ BOM ซึ่งรวมถึงคอมไพล์ตัวอย่าง (แม้ในหน้าต่าง) คุณจะมีปัญหาหากคุณใช้ไฟล์ที่สร้างขึ้นในลักษณะนี้ด้วยเครื่องมือที่ไม่รู้จัก BOM เช่นคุณพยายามสร้าง.gitignoreโดยใช้คำสั่งนี้และสงสัยว่าทำไมมันไม่ทำงาน BOM เป็นเหตุผล
martixy

96

วิธีสร้างไฟล์เปล่า:

New-Item -ItemType file example.txt

หากต้องการอัพเดตเวลาประทับของไฟล์:

(gci example.txt).LastWriteTime = Get-Date

4
ฉันคิดว่านี่เป็นวิธีที่ดีที่สุด!
Jayesh Bhoot

ใช้งานได้กับการอัพเดตการประทับเวลาของโฟลเดอร์หรือไม่
riahc3

1
@ riahc3 (gi MyFolder).LastWriteTime = Get-Dateใช้นี้ คุณสามารถใช้สำหรับไฟล์ได้เช่นกัน
dangph

9
สาระสำคัญมากขึ้น:ni example.txt
นิคคอคส์

2
วิธีนี้ไม่ได้เพิ่มไบต์ BOM อันยิ่งใหญ่และการเข้ารหัสอย่างมีความสุขปรากฏว่าเป็น UTF-8
Davos

75

นี่คือเวอร์ชันที่สร้างไฟล์ใหม่หากไม่มีอยู่หรืออัปเดตการประทับเวลาหากมีอยู่

Function Touch-File
{
    $file = $args[0]
    if($file -eq $null) {
        throw "No filename supplied"
    }

    if(Test-Path $file)
    {
        (Get-ChildItem $file).LastWriteTime = Get-Date
    }
    else
    {
        echo $null > $file
    }
}

4
นี่เป็นคำตอบที่ถูกต้องสำหรับการทำซ้ำโปรแกรม Unix touch (แม้ว่าจะมีชื่อแตกต่างกัน) แต่คำถามก็คือการสร้างไฟล์ใหม่
Jamie Schembri

14
มากมากเล่นลิ้นเล็ก ๆ : ในขณะที่สัมผัสไฟล์สอดคล้องกับแผนการตั้งชื่อกริยาคำนามจาก PS, Touchไม่ได้เป็น "อนุมัติ" คำกริยา (ไม่ได้ว่ามันเป็นความต้องการอย่างมีนัยสำคัญ: msdn.microsoft.com/en-us/library/ms714428 aspx ) Fileดี btw ฉันแนะนำชื่อSet-FileหรือSet-LastWriteTimeหรือรายการโปรดของฉันUpdate-File. นอกจากนี้ผมจะแนะนำแทนAdd-Content $file $null echo $null > $fileสุดท้ายตั้งค่านามแฝงด้วยSet-Alias touch Update-Fileหากคุณต้องการใช้คำสั่งต่อไปtouch
Alan McBee

แนะนำให้เพิ่มสิ่งนี้เป็นบรรทัดสุดท้าย:New-Alias -Name Touch Touch-File
stimpy77

25

ใน PowerShell คุณสามารถสร้างฟังก์ชั่น Touch ที่คล้ายกันเช่น:

function touch {set-content -Path ($args[0]) -Value ($null)} 

การใช้งาน:

touch myfile.txt

แหล่ง


ขอบคุณมาก! สิ่งที่ฉันต้องการ! ความคิดใดที่ฉันสามารถติดตั้งฟังก์ชันนี้ลงใน PowerShell เพื่อให้โหลดโดยอัตโนมัติเมื่อฉันเริ่มต้นเชลล์
jsalonen

2
เพิ่มลงในไฟล์ $ profile (เรียกใช้ notepad $ profile เพื่อแก้ไขไฟล์นั้น)
ทำเครื่องหมายว่าอัลเลน

25
นี่จะเป็นการลบเนื้อหาของไฟล์ถ้ามันมีอยู่
dangph

1
หรือรุ่นที่ปลอดภัยที่ไม่ได้ลบเนื้อหาไฟล์ที่มีอยู่ function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } }
alastairtree

13

ฉันชอบ

fc > filename

สำหรับงานนี้ ในการทำงานกับไฟล์ที่ไม่ว่างคุณสามารถใช้

fc >> filename

fcเป็นเพียงนามแฝงสำหรับ รูปแบบกำหนดเอง ผมเลือกมันเพราะมันเป็นคำสั่งสั้น ๆ ที่ไม่ทำอะไรเลยในบริบทนี้ noop มันก็ดีเพราะถ้าคุณลืมการเปลี่ยนเส้นทาง

fc filename

แทนที่จะให้ข้อผิดพลาดกับคุณอีกครั้งมันก็ไม่ทำอะไรเลย นามแฝงอื่น ๆ ที่จะใช้งานได้

ft -> Format-Table
fw -> Format-Wide

9

มีคำตอบที่สมควรแล้ว แต่ฉันชอบนามแฝงของ New-Item ซึ่งก็คือ: ni

คุณยังสามารถละทิ้งการประกาศประเภทไฟล์ (ซึ่งฉันถือว่าเป็นนัยเมื่อมีการเพิ่มส่วนขยาย) ดังนั้นเพื่อสร้างไฟล์จาวาสคริปต์ที่มีชื่อ 'x' ในไดเรกทอรีปัจจุบันของฉันฉันสามารถเขียน:

ni x.js

3 ตัวอักษรเร็วกว่าการสัมผัส!


นี่ไม่ใช่ idempotentni : The file 'x.js' already exists
Steven Penny

8

ฉันรวบรวมแหล่งข้อมูลต่าง ๆ และต่อไปนี้ซึ่งสอดคล้องกับความต้องการของฉัน ฉันต้องการตั้งค่าวันที่เขียนของ DLL ที่สร้างขึ้นในเครื่องในเขตเวลาอื่น:

$update = get-date
Set-ItemProperty -Path $dllPath -Name LastWriteTime -Value $update

แน่นอนคุณยังสามารถตั้งค่าได้หลายไฟล์:

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update

1
+1 สำหรับวิธี Powershell-ish ที่สุดในการเปลี่ยน LastWriteTime บนไฟล์ (ซึ่งเป็นสิ่งที่ฉันต้องการ) แม้ว่าคำถามจะเน้นที่คุณลักษณะการสร้างไฟล์ใหม่ของคำสั่ง touch
Nathan Hartley

โดยไม่ใช้ตัวแปร?
riahc3

5

เปิดไฟล์โปรไฟล์ของคุณ:

notepad $profile

เพิ่มบรรทัดต่อไปนี้:

function touch {New-Item "$args" -ItemType File}

บันทึกและโหลด $ โปรไฟล์ของคุณใหม่เพื่อใช้งานทันที (ไม่จำเป็นต้องปิดและเปิด powerhell)

. $profile

ในการเพิ่มไฟล์ใหม่ในประเภทไดเรกทอรีปัจจุบัน:

touch testfile.txt

ในการเพิ่มไฟล์ใหม่ภายในประเภทไดเรกทอรี 'myfolder':

touch myfolder\testfile.txt

หากไฟล์ที่มีชื่อเดียวกันมีอยู่แล้วไฟล์นั้นจะไม่ถูกลบล้าง แต่คุณจะได้รับข้อผิดพลาด

ฉันหวังว่ามันจะช่วย

เคล็ดลับโบนัส:

คุณสามารถทำให้เทียบเท่ากับ 'mkdir' เพิ่มบรรทัดต่อไปนี้:

function mkdir {New-Item "$args" -ItemType Directory} 

ใช้เหมือนกัน:

mkdir testfolder
mkdir testfolder\testsubfolder

5
ac file.txt $null

จะไม่ลบเนื้อหาไฟล์ แต่จะไม่อัปเดตวันที่เช่นกัน


5

ดูเหมือนว่าคำตอบมากมายที่นี่จะไม่มีผลกับการเข้ารหัสไฟล์

ฉันเพิ่งพบปัญหานี้ด้วยเหตุผลอื่น ๆ อีกมากมาย แต่

echo $null > $file

$null > $file

ทั้งคู่ผลิตไฟล์ UTF-16-LE ในขณะที่

New-Item $file -type file

สร้างไฟล์ UTF-8

ไม่ว่าจะด้วยเหตุผลใดfc > $fileและfc >> $fileดูเหมือนว่าจะสร้างไฟล์ UTF-8

Out-File $file -encoding utf8

ให้ไฟล์ UTF-8-BOM แก่คุณ

Out-File $file -encoding ascii

ให้ไฟล์ UTF-8 แก่คุณ การเข้ารหัสที่ถูกต้อง (แต่ยังไม่ทดสอบ) อื่น ๆ ที่สนับสนุนไฟล์ออกคือ: [[-Encoding] {unknown | สตริง | Unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | เริ่มต้น | OEM}] คุณยังสามารถไพพ์ข้อมูลไปยัง Out-File เพื่อให้ไฟล์ข้อมูลบางอย่างเพื่อจัดเก็บและแฟล็ก -end ตัวอย่างเช่น:

echo $null | Out-File .\stuff.txt -Encoding ascii -Append

ตัวอย่างนี้ไม่ได้อัพเดตการประทับเวลาด้วยเหตุผลบางอย่าง แต่อย่างนี้ไม่:

echo foo | Out-File .\stuff.txt -Encoding ascii -Append

แม้ว่ามันจะมีผลข้างเคียงของการผนวก "foo" ต่อท้ายไฟล์

หากคุณไม่แน่ใจเกี่ยวกับการเข้ารหัสที่คุณมีฉันพบว่า VS-Code มีคุณสมบัติที่ดีที่มุมล่างขวามือบอกว่าการเข้ารหัสคืออะไร ฉันคิดว่า Notepad ++ ยังมีคุณสมบัติที่คล้ายกัน


Set-Content -Path $file -value $nullทำงานและไม่มีผลต่อการเข้ารหัสไฟล์ ตรวจสอบรุ่น ss64touchด้วย
Anton Krouglov

3

สำหรับสถานการณ์ที่คุณอธิบาย (เมื่อไม่มีไฟล์) สิ่งนี้ทำได้ง่ายและรวดเร็ว:

PS> sc example.txt $null

อย่างไรก็ตามการใช้งานทั่วไปอื่น ๆtouchคือการอัพเดตเวลาประทับของไฟล์ หากคุณลองใช้scตัวอย่างของฉันแบบนั้นมันจะลบเนื้อหาของไฟล์


1
ขอบคุณ! อะไรscหมายความว่าอย่างไร แก้ไข: คิดออก ("ตั้งเนื้อหา")
jsalonen

2

เพื่อสร้างไฟล์เปล่าใน windows วิธีที่รวดเร็วมีดังต่อไปนี้:

fsutil file createnew file.name 0

ศูนย์คือขนาดไฟล์ในหน่วยไบต์ดังนั้นจึงเป็นประโยชน์ในการสร้างไฟล์ขนาดใหญ่ (จะไม่เป็นประโยชน์สำหรับการทดสอบการบีบอัดเนื่องจากไม่มีข้อมูลจริงและจะบีบอัดให้เหลือน้อยมาก)


2

หน้าเว็บhttp://xahlee.info/powershell/PowerShell_for_unixer.htmlแนะนำ:

new-item -type file [filename]

และนี่จะเป็นการสร้างไฟล์ใหม่ที่มีขนาดเป็นศูนย์

สิ่งนี้ไม่ได้ทำหน้าที่อื่น ๆ ของ Unix touchนั่นคือการอัพเดทเวลาถ้าชื่อไฟล์มีอยู่แล้ว แต่คำถามก็หมายความว่าผู้ใช้เพียงแค่ต้องการสร้างไฟล์ขนาดศูนย์แบบโต้ตอบโดยไม่ต้องหันไปใช้ Notepad


1

ผมใช้ชื่อ "เขียนแฟ้ม" เพราะ "สัมผัส" ไม่ได้เป็นได้รับการอนุมัติคำกริยา PowerShell อย่างไรก็ตามฉันยังคงใช้นามแฝงเป็นสัมผัส

Touch.psm1

<#
 .Synopsis
  Creates a new file or updates the modified date of an existing file.

 .Parameter Path
  The path of the file to create or update.
#>
Function Write-File {
    [CmdletBinding()]
    Param(
       [Parameter( Mandatory=$True, Position=1 )]
       [string] $Path,
       [switch] $WhatIf,
       [System.Management.Automation.PSCredential] $Credential
    )
    $UseVerbose = $PSCmdlet.MyInvocation.BoundParameters['Verbose'].IsPresent -eq $True
    $UseDebug = $PSCmdlet.MyInvocation.BoundParameters['Debug'].IsPresent -eq $True
    $TimeStamp = Get-Date
    If( -Not [System.Management.Automation.WildcardPattern]::ContainsWildcardCharacters( $Path ) ) {
        New-Item -ItemType:File -Verbose:$UseVerbose -Debug:$UseDebug -WhatIf:$WhatIf -Credential $Credential -Path $Path -ErrorAction SilentlyContinue -Confirm:$False | Out-Null
    }
    Set-ItemProperty -Verbose:$UseVerbose -Debug:$UseDebug -WhatIf:$WhatIf -Credential $Credential -Path $Path -Name LastWriteTime -Value:$TimeStamp -Confirm:$False | Out-Null
}

Set-Alias -Name touch -Value Write-File

Export-ModuleMember -Function Write-File
Export-ModuleMember -Alias touch

การใช้งาน:

Import-Module ./Touch.psm1
touch foo.txt

สนับสนุน:

  • พา ธ ในไดเรกทอรีอื่น
  • Credential สำหรับเส้นทางเครือข่าย
  • Verbose, DebugและWhatIfธง
  • สัญลักษณ์แทน (อัพเดตเฉพาะการประทับเวลาเท่านั้น)

New-Itemคำสั่งได้รับการเสนอในสี่คำตอบก่อนหน้านี้ คุณได้จัดเตรียมเสื้อคลุม 20 บรรทัดไว้สำหรับมัน คุณช่วยอธิบายให้ชัดเจนมากขึ้นได้อย่างไรว่าโซลูชันของคุณมีประโยชน์มากกว่าโซลูชันรุ่นก่อน ตัวอย่างเช่นสิ่งเหล่านี้Verbose, DebugและWhatIfธง ฯลฯ ?
สกอตต์

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