題 相當於Linux`touch`用PowerShell創建一個空文件? [重複]


這個問題在這裡已有答案:

在PowerShell中有相當於 touch

例如在Linux中我可以通過調用創建一個新的空文件:

touch filename

在Windows上這很尷尬 - 通常我只是打開一個新的記事本實例並保存一個空文件。

那麼PowerShell中有一種編程方式可以做到這一點嗎?

我不是要完全匹配觸摸行為,而只是為了找到創建空文件的最簡單的等價物。


135
2017-11-07 19:28


起源


看到 Windows版Unix touch命令 & Windows相當於Linux命令'touch'? - amiregelz
謝謝。我看著他們,但大多數答案都集中在命令提示符上。我想要一個不要求我安裝新應用程序的PowerShell解決方案。 - jsalonen
關注這個問題 - 這兩個功能只有幾行代碼,只需實現兩者,而不僅僅是一半,尤其是。當失踪的另一半命令是如此危險。 - yzorg
@yzorg:這兩個功能是什麼意思?我只是問你如何在PS中創建一個空文件 touch 在Linux中。 - jsalonen
@jsalonen使用* nix touch 在現有文件上,它將更新上次寫入時間而不修改文件,請參閱@amiregelz中的鏈接。這個問題有很高的谷歌排名 powershell touch,我想提醒複製/粘貼者,當* nix touch沒有時,只有這一半可以破壞數據。請參閱@LittleBoyLost答案,該答案處理文件已存在的時間。 - yzorg


答案:


使用追加重定向器“>>”解決了刪除現有文件的問題:

echo $null >> filename

141
2017-11-07 19:36



在命令提示符中也稱為“echo null> filename”,可能是批處理文件。很酷,看看它的PowerShell版本,謝謝! - Mark Allen
如果文件已存在,則touch與此不同 - jk.
迴聲是不必要的, $null > filename 效果很好。 - alirobe
這為我寫了2個字節的unicode BOM 0xFEFF。 - mlt
重要說明:許多unix工具不處理BOM。這包括例如git(甚至在Windows上)。如果您使用以這種方式創建的文件使用無法識別BOM的工具,您將遇到問題。例如你試著創造你的 .gitignore 使用此命令並想知道為什麼它不起作用。 BOM是原因。 - martixy


這是一個創建新文件但不存在的版本,如果存在,則更新時間戳。

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

74
2018-03-25 12:47



這是複制Unix觸摸程序的正確答案(儘管名稱不同),但問題僅在於創建一個新文件。 - Jamie Schembri
非常, 非常 微小的狡辯:雖然Touch-File符合PS的Verb-Noun命名慣例, Touch 不是“已批准”的動詞(並不是一個重要的要求: msdn.microsoft.com/en-us/library/ms714428.aspx)。 File 很好,順便說一下。我推薦這些名字 Set-File 要么 Set-LastWriteTime 或者,我最喜歡的, Update-File。另外,我會建議 Add-Content $file $null 代替 echo $null > $file。最後,設置別名 Set-Alias touch Update-File 如果你想繼續使用該命令 touch - Alan McBee


要創建空白文件:

New-Item -ItemType file example.txt

要更新文件的時間戳:

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

68
2018-01-24 06:39



我認為這是最好的方法! - Jayesh Bhoot
這是否適用於更新文件夾的時間戳? - riahc3
@ riahc3,用這個: (gi MyFolder).LastWriteTime = Get-Date 。您也可以將它用於文件。 - dangph
更精闢: ni example.txt - Nick Cox
此方法不會添加可怕的BOM字節,並且編碼很愉快地顯示為UTF-8。 - Davos


在PowerShell中,您可以創建類似的Touch功能:

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

用法:

touch myfile.txt

資源


24
2017-11-07 19:32



這很好,謝謝!正是我想要的!我有什麼想法可以將這個功能安裝到PowerShell中,以便在啟動shell時自動加載它? - jsalonen
將其添加到您的$ profile文件中。 (運行notepad $ profile來編輯該文件。) - Mark Allen
這將刪除文件的內容(如果存在)。 - dangph
或者不清除現有文件內容的安全版本 function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } } - alastairtree


我更喜歡

fc > filename

為了這個任務。要使用非空文件,您可以使用

fc >> filename

fc 只是一個別名 格式自定義。我選擇了它 因為它是一個簡短的命令,在這種情況下什麼也不做,a 空操作。這也很好,因為如果你忘記了 重定向

fc filename

而不是給你一個錯誤,它再也沒有做任何事情。其他一些別名 這將是有效的

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

10
2017-09-30 05:10





我把各種來源放在一起,最後滿足了我的需求。我需要設置在不同時區的機器上構建的DLL的寫日期:

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

當然,您也可以為多個文件設置它:

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

8
2018-01-26 00:33



儘管問題主要集中在touch命令的新文件創建功能上,但是對於Powershell-ish來說,改變文件上LastWriteTime的方式是+1(這就是我需要的)。 - Nathan Hartley
不使用變量? - riahc3


已經有一堆有價值的答案,但我非常喜歡New-Item的別名:ni

您也可以放棄文件類型聲明(我假設在添加擴展時是隱式的),因此要在當前目錄中創建名為“x”的javascript文件,我可以簡單地寫:

ni x.js

3個字符比觸摸快!


7
2018-06-15 16:45



這不是冪等的 ni : The file 'x.js' already exists - Steven Penny


打開個人資料文件:

notepad $profile

添加以下行:

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

保存並重新加載您的$個人資料,以便立即使用它。 (無需關閉並打開powershell)

. $profile

要在當前目錄中添加新文件,請執行以下操作:

touch testfile.txt

要在“myfolder”目錄中添加新文件,請鍵入:

touch myfolder\testfile.txt

如果已存在具有相同名稱的文件,則不會覆蓋該文件。相反,你會得到一個錯誤。

我希望它有所幫助

獎金提示:

您可以使用“mkdir”等效添加以下行:

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

相同用途:

mkdir testfolder
mkdir testfolder\testsubfolder

4
2018-03-08 12:47