Tương đương với Linux `touch` để tạo một tệp trống với PowerShell? [bản sao]


167

Câu hỏi này đã có câu trả lời ở đây:

Trong PowerShell có tương đương với touch?

Ví dụ trong Linux, tôi có thể tạo một tệp trống mới bằng cách gọi:

touch filename

Trên Windows, điều này khá khó xử - thông thường tôi chỉ cần mở một phiên bản mới của notepad và lưu một tệp trống.

Vậy có cách lập trình nào trong PowerShell để làm việc này không?

Tôi không tìm cách khớp chính xác hành vi của cảm ứng, mà chỉ để tìm cách tương đương đơn giản nhất có thể để tạo các tệp trống.



Cảm ơn. Tôi nhìn họ, nhưng hầu hết câu trả lời tập trung vào dấu nhắc lệnh. Tôi muốn có một giải pháp PowerShell không yêu cầu tôi phải cài đặt các ứng dụng mới.
jsalonen

Bỏ qua câu hỏi - cả hai tính năng chỉ là một vài dòng mã, chỉ cần thực hiện cả hai, không chỉ một nửa, đặc biệt. khi thiếu một nửa lệnh khác rất nguy hiểm.
yzorg

@yzorg: Ý của cả hai tính năng là gì? Tôi chỉ hỏi làm thế nào để tạo một tập tin trống trong PS theo cách bạn có thể làm với touchLinux.
jsalonen

@jsalonen Sử dụng * nix touchtrên một tệp hiện có, nó sẽ cập nhật lần ghi cuối cùng mà không sửa đổi tệp, xem các liên kết từ @amiregelz. Câu hỏi này có thứ hạng cao trên google powershell touch, tôi muốn cảnh báo những người sao chép / dán rằng chỉ một nửa trong số đó có thể phá hủy dữ liệu, khi * nix touch không. Xem câu trả lời @LittleBoyLost xử lý khi tệp đã tồn tại.
yzorg

Câu trả lời:


165

Sử dụng trình chuyển hướng chắp thêm ">>" giải quyết vấn đề trong đó một tệp hiện có bị xóa:

echo $null >> filename

3
Còn được gọi là 'echo null> tên tệp' từ dấu nhắc lệnh, có thể là tệp bó. Thật tuyệt khi thấy phiên bản PowerShell của nó, cảm ơn!
Mark Allen

16
cảm ứng khá khác so với điều này nếu tập tin đã tồn tại
jk.

9
echo là không cần thiết, $null > filenamehoạt động tuyệt vời.
alirobe

8
Điều này ghi 2 byte unicode BOM 0xFEFF cho tôi.
mlt

4
Lưu ý quan trọng: Nhiều công cụ unix không giao dịch với BOM. Điều này bao gồm git chẳng hạn (ngay cả trên windows). Bạn sẽ gặp vấn đề nếu bạn sử dụng các tệp được tạo theo cách này với các công cụ không nhận ra BOM. ví dụ: bạn cố gắng tạo .gitignorelệnh của mình bằng lệnh này và tự hỏi tại sao nó không hoạt động. BOM là lý do.
martixy

96

Để tạo một tập tin trống:

New-Item -ItemType file example.txt

Để cập nhật dấu thời gian của tệp:

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

4
Tôi nghĩ rằng đây là cách tiếp cận tốt nhất!
Jayesh Bhoot

Điều này có hoạt động để cập nhật dấu thời gian của một thư mục không?
riahc3

1
@ riahc3, sử dụng cái này : (gi MyFolder).LastWriteTime = Get-Date. Bạn có thể sử dụng nó cho các tập tin quá.
dangph

9
Thậm chí nhiều hơn:ni example.txt
Nick Cox

2
Phương pháp này không thêm các byte BOM khủng khiếp và mã hóa vui vẻ xuất hiện là UTF-8.
Davos

75

Đây là phiên bản tạo tệp mới nếu nó không tồn tại hoặc cập nhật dấu thời gian nếu nó tồn tại.

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
Đây là câu trả lời chính xác để sao chép chương trình cảm ứng Unix (mặc dù có một tên khác), nhưng câu hỏi được định hướng chỉ đơn giản là tạo một tệp mới.
Jamie Schembri

14
Rất, rất phân minh tí hon: Trong khi Touch-file phù hợp với các quy ước đặt tên Động từ-Noun của PS, Touchkhông phải là một "phê duyệt" verb (không rằng đó là một yêu cầu quan trọng: msdn.microsoft.com/en-us/library/ms714428. aspx ). Filelà tốt, btw. Tôi đề nghị tên Set-Filehoặc Set-LastWriteTimehoặc, yêu thích của tôi , Update-File. Ngoài ra, tôi muốn giới thiệu Add-Content $file $nullthay vì echo $null > $file. Cuối cùng, đặt bí danh Set-Alias touch Update-Filenếu bạn muốn tiếp tục sử dụng lệnhtouch
Alan McBee

Đề nghị thêm dòng này làm dòng cuối cùng:New-Alias -Name Touch Touch-File
activpy77

25

Trong PowerShell, bạn có thể tạo một chức năng Touch tương tự như sau:

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

Sử dụng:

touch myfile.txt

Nguồn


Điều này thật tuyệt, cảm ơn! Chỉ cần những gì tôi muốn! Bất kỳ ý tưởng nào về cách tôi có thể cài đặt chức năng này vào PowerShell để nó tự động tải khi tôi khởi động trình bao?
jsalonen

2
Thêm nó vào tập tin hồ sơ $ của bạn. (Chạy notepad $ profile để chỉnh sửa tệp đó.)
Mark Allen

25
Điều này sẽ xóa nội dung của tập tin nếu nó tồn tại.
dangph

1
Hoặc phiên bản an toàn không xóa nội dung tệp hiện có function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } }
alastairtree

13

tôi thích

fc > filename

cho nhiệm vụ này. Để làm việc với các tệp không trống, bạn có thể sử dụng

fc >> filename

fcchỉ đơn giản là một bí danh cho Format-Custom . Tôi đã chọn nó bởi vì nó là một lệnh ngắn mà không có gì trong bối cảnh này, một noop . Nó cũng tốt bởi vì nếu bạn quên chuyển hướng

fc filename

thay vì đưa ra một lỗi, một lần nữa nó chẳng làm gì cả. Một số bí danh khác sẽ hoạt động là

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

9

Đã có một loạt các câu trả lời xứng đáng, nhưng tôi khá thích bí danh của New-Item chỉ là: ni

Bạn cũng có thể từ bỏ khai báo loại tệp (mà tôi giả sử là ẩn khi thêm tiện ích mở rộng), vì vậy để tạo tệp javascript có tên 'x' trong thư mục hiện tại của tôi, tôi chỉ cần viết:

ni x.js

3 ký tự nhanh hơn cảm ứng!


Đây không phải là bình thườngni : The file 'x.js' already exists
Steven Penny

8

Tôi kết hợp nhiều nguồn khác nhau và giải quyết những điều sau đây, đáp ứng nhu cầu của tôi. Tôi cần đặt ngày ghi của một DLL được xây dựng trên máy theo múi giờ khác:

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

Tất nhiên, bạn cũng có thể đặt nó cho nhiều tệp:

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

1
+1 cho cách Powershell-ish nhiều nhất để thay đổi LastWriteTime trên một tệp (đó là điều tôi cần), mặc dù câu hỏi tập trung vào tính năng tạo tệp mới của lệnh cảm ứng.
Nathan Hartley

Không sử dụng một biến?
riahc3

5

Mở tệp hồ sơ của bạn:

notepad $profile

Thêm dòng sau:

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

Lưu nó và tải lại hồ sơ $ của bạn để sử dụng nó ngay lập tức. (Không cần phải đóng và mở powershell)

. $profile

Để thêm một tệp mới trong loại thư mục hiện tại:

touch testfile.txt

Để thêm một tệp mới trong loại thư mục 'myfolder':

touch myfolder\testfile.txt

Nếu một tệp có cùng tên đã tồn tại, nó sẽ không bị ghi đè. Thay vào đó, bạn sẽ gặp lỗi.

Tôi hy vọng nó sẽ giúp

Tiền thưởng:

Bạn có thể tạo tương đương với 'mkdir' khi thêm dòng sau:

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

Sử dụng tương tự:

mkdir testfolder
mkdir testfolder\testsubfolder

5
ac file.txt $null

Sẽ không xóa nội dung tệp nhưng nó cũng không cập nhật ngày.


5

Có vẻ như một loạt các câu trả lời ở đây không giải thích cho mã hóa tập tin.

Tôi chỉ gặp vấn đề này, vì nhiều lý do khác, nhưng

echo $null > $file

$null > $file

cả hai đều tạo ra tệp UTF-16-LE, trong khi

New-Item $file -type file

tạo tệp UTF-8.

Vì lý do gì fc > $filefc >> $filedường như cũng tạo ra các tệp UTF-8.

Out-File $file -encoding utf8

cung cấp cho bạn tệp UTF-8-BOM, trong khi

Out-File $file -encoding ascii

cung cấp cho bạn tệp UTF-8. Các mã hóa hợp lệ (nhưng chưa được kiểm tra) khác mà Out-File hỗ trợ là: [[-Encoding] {unknown | chuỗi | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | mặc định | OEM}]. Bạn cũng có thể chuyển nội dung vào Out-File để cung cấp cho tệp một số dữ liệu văn bản để lưu trữ và cũng là cờ -append. Ví dụ:

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

ví dụ này không cập nhật dấu thời gian vì một số lý do, nhưng cái này thì có:

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

Mặc dù nó có tác dụng phụ là thêm "foo" vào cuối tập tin.

Nếu bạn không chắc chắn về việc bạn có mã hóa gì, tôi đã tìm thấy VS-Code có một tính năng tiện lợi trong đó ở góc dưới bên phải, nó cho biết mã hóa là gì. Tôi nghĩ Notepad ++ cũng có một tính năng tương tự.


Set-Content -Path $file -value $nullthực hiện công việc và nó không ảnh hưởng đến mã hóa tập tin. Kiểm tra phiên bản ss64 củatouch .
Anton Krouglov

3

Đối với kịch bản bạn đã mô tả (khi tệp không tồn tại), việc này nhanh chóng và dễ dàng:

PS> sc example.txt $null

Tuy nhiên, cách sử dụng phổ biến khác touchlà cập nhật dấu thời gian của tệp. Nếu bạn cố gắng sử dụng scví dụ của tôi theo cách đó, nó sẽ xóa nội dung của tệp.


1
Cảm ơn! Có scnghĩa là gì? Chỉnh sửa: tìm ra nó ("Đặt nội dung")
jsalonen

2

để tạo một tập tin trống trong windows, cách nhanh nhất là như sau:

fsutil file createnew file.name 0

Số 0 được kích thước tệp theo byte, do đó, điều này cũng hữu ích để tạo tệp lớn (chúng sẽ không hữu ích để kiểm tra nén vì chúng không chứa dữ liệu thực tế và sẽ nén xuống gần như không có gì)


2

Trang web http://xahlee.info/powershell/PowerShell_for_unixer.html gợi ý:

new-item -type file [filename]

và điều này thực sự tạo ra một tệp mới có kích thước bằng không.

Điều này không thực hiện chức năng khác của Unix touch, cụ thể là cập nhật dấu thời gian nếu tên tệp đã tồn tại, nhưng câu hỏi ngụ ý rằng người dùng chỉ muốn tạo một tệp có kích thước bằng 0 mà không cần dùng đến Notepad.


1

Tôi đã sử dụng tên "Write-File" vì "Touch" không phải là động từ PowerShell được phê duyệt . Tôi vẫn bí danh nó như chạm, tuy nhiên.

Chạm.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

Sử dụng:

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

Hỗ trợ:

  • Đường dẫn trong các thư mục khác
  • Credential cho đường dẫn mạng
  • Verbose, DebugWhatIfcờ
  • ký tự đại diện (chỉ cập nhật dấu thời gian)

Các New-Itemlệnh đã được đưa ra trong bốn câu trả lời trước. Bạn đã cung cấp một trình bao bọc 20 dòng cho nó. Bạn có thể giải thích rõ hơn một chút về lợi thế của giải pháp của bạn so với những giải pháp trước đó không? Ví dụ, đây là những gì Verbose, DebugWhatIfcờ, vv?
Scott

Một sự khác biệt quan trọng giữa câu trả lời này và New-Itemlà điều này cập nhật dấu thời gian của các tệp hiện có.
jpaugh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.