Câu hỏi Tương đương với Linux `touch` để tạo một tệp rỗng với PowerShell? [bản sao]


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 rỗng mới bằng cách gọi:

touch filename

Trên Windows, điều này khá là lúng túng - thường tôi chỉ cần mở một ví dụ mới của notepad và lưu một tập tin rỗng.

Vì vậy, có một cách lập trình trong PowerShell để làm điều này?

Tôi không tìm kiếm chính xác phù hợp với hành vi của cảm ứng, nhưng chỉ để tìm các tương đương đơn giản nhất có thể để tạo các tập tin rỗng.


133
2017-11-07 19:28


gốc


Xem Phiên bản Windows của lệnh cảm ứng Unix & Windows tương đương với lệnh Linux 'touch'? - amiregelz
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 mà không yêu cầu tôi phải cài đặt các ứng dụng mới. - jsalonen
Downvoted 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 một nửa lệnh còn thiếu là rất nguy hiểm. - yzorg
@yzorg: Bạn có ý nghĩa gì bởi cả hai tính năng? Tôi chỉ hỏi làm thế nào để tạo một tập tin rỗng trong PS theo cách bạn có thể làm với touch trong Linux. - jsalonen
@jsalonen Sử dụng * nix touch trên một tệp hiện có, nó sẽ cập nhật thời gian 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 cho powershell touch, Tôi muốn cảnh báo sao chép / dán-ers rằng chỉ một nửa của nó có thể phá hủy dữ liệu, khi * nix touch không. Xem @LittleBoyLost câu trả lời xử lý khi tệp đã tồn tại. - yzorg


Các câu trả lời:


Sử dụng trình chuyển hướng nối tiếp ">>" giải quyết sự cố khi tệp hiện có bị xóa:

echo $null >> filename

139
2017-11-07 19:36



Còn được gọi là 'echo null> filename' từ một dấu nhắc lệnh, có thể là một tệp lô. Thật tuyệt khi thấy phiên bản PowerShell của nó, cảm ơn! - Mark Allen
cảm ứng khác với điều này nếu tệp đã tồn tại - jk.
echo là không cần thiết, $null > filename hoạt động tốt. - alirobe
Điều này viết 2 byte của unicode BOM 0xFEFF cho tôi. - mlt
Lưu ý quan trọng: Nhiều công cụ unix không xử lý BOM. Điều này bao gồm git ví dụ (ngay cả trên cửa sổ). 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 .gitignore sử dụng lệnh này và tự hỏi tại sao nó không hoạt động. BOM là lý do. - martixy


Đâ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
    }
}

73
2018-03-25 12:47



Đây là câu trả lời đúng để nhân rộng chương trình cảm ứng Unix (mặc dù với một tên khác), nhưng câu hỏi được định hướng là chỉ cần tạo một tệp mới. - Jamie Schembri
Rất, rất nhỏ ngụy trang: Trong khi Touch-File tuân theo quy ước đặt tên Verb-Noun của PS, Touch không phải là động từ "được phê duyệt" (không phải là một yêu cầu quan trọng: msdn.microsoft.com/en-us/library/ms714428.aspx). File là tốt, btw. Tôi khuyên bạn nên đặt tên Set-File hoặc là Set-LastWriteTime hoặ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 $null thay vì echo $null > $file. Cuối cùng, đặt bí danh với Set-Alias touch Update-File nếu bạn muốn tiếp tục sử dụng lệnh touch - Alan McBee


Để tạo tệp trống:

New-Item -ItemType file example.txt

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

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

63
2018-01-24 06:39



Tôi nghĩ đây là cách tiếp cận tốt nhất! - Jayesh Bhoot
Tính năng 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
@ riahc3, sử dụng điều này: (gi MyFolder).LastWriteTime = Get-Date . Bạn cũng có thể sử dụng nó cho các tệp. - dangph
Thậm chí nhiều hơn pithy: ni example.txt - Nick Cox
Phương pháp này không thêm các byte BOM khủng khiếp và mã hóa vui vẻ dường như là UTF-8. - Davos


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

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

Sử dụng:

touch myfile.txt

Nguồn


24
2017-11-07 19:32



Điều này thật tuyệt vời, cảm ơn! Chỉ là những gì tôi muốn! Bất kỳ ý tưởng làm thế nào tôi có thể cài đặt chức năng này vào PowerShell để nó tải tự động khi tôi bắt đầu trình bao? - jsalonen
Thêm nó vào tệp hồ sơ $ của bạn. (Chạy notepad $ profile để chỉnh sửa tập tin đó.) - Mark Allen
Thao tác này sẽ xóa nội dung của tệp nếu nó tồn tại. - dangph


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

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

fc filename

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

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

10
2017-09-30 05:10





Tôi tập hợp nhiều nguồn khác nhau, và kết hợp với những điều sau đây, đáp ứng nhu cầu của tôi. Tôi cần phải thiết lập ngày ghi của một DLL được xây dựng trên một máy tính trong một 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

7
2018-01-26 00:33



1 cho hầu hết các Powershell-ish cách để thay đổi LastWriteTime trên một tập tin (đó là những gì tôi cần), mặc dù câu hỏi tập trung vào tính năng tạo tập tin mới của lệnh cảm ứng. - Nathan Hartley
Không sử dụng biến? - riahc3


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 mà chỉ là: ni

Bạn cũng có thể từ bỏ khai báo kiểu tệp (mà tôi giả định là ngầm định khi phần mở rộng được thêm vào), do đó, để tạo tệp javascript có tên 'x' trong thư mục hiện tại của tôi, tôi có thể viết:

ni x.js

3 ký tự nhanh hơn liên lạc!


6
2018-06-15 16:45



Đây không phải là không đáng kể ni : The file 'x.js' already exists - Steven Penny


Mở tệp tiểu sử của bạn:

notepad $profile

Thêm dòng sau:

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

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

. $profile

Để thêm tệp mới vào loại thư mục hiện tại:

touch testfile.txt

Để thêm tệp mới bên 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ể làm tương đương với 'mkdir' thêm dòng sau:

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

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

mkdir testfolder
mkdir testfolder\testsubfolder

4
2018-03-08 12:47





ac file.txt $null

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


4
2017-08-12 12:52