等价于Linux`touch`用PowerShell创建一个空文件?[重复]


167

这个问题已经在这里有了答案:

在PowerShell中有等效的touch吗?

例如在Linux中,我可以通过调用以下命令创建一个新的空文件:

touch filename

在Windows上,这很尴尬-通常,我只是打开一个新的记事本实例并保存一个空文件。

那么,PowerShell中是否有编程方式可以做到这一点?

我不是要完全匹配触摸行为,而是要找到创建空文件的最简单等效方法。



谢谢。我看着它们,但是大多数答案都集中在命令提示符上。我想要一个不需要我安装新应用程序的PowerShell解决方案。
jsalonen 2012年

否定了这个问题-这两个功能仅是几行代码,仅实现两者,而不仅仅是实现一半。当缺少的另一半命令如此危险时。
yzorg 2014年

@yzorg:这两个功能分别代表什么?我只是问如何在PS中以touch在Linux中创建空文件的方式。
jsalonen

@jsalonen touch在现有文件上使用* nix ,它将在不修改文件的情况下更新上次写入时间,请参阅@amiregelz中的链接。这个问题在上的google排名很高powershell touch,我想提醒复制者/粘贴者,如果* nix touch不能,只有这一半可以破坏数据。请参阅@LittleBoyLost答案,该答案将在文件已存在时进行处理。
yzorg 2014年

Answers:


164

使用附加重定向器“ >>”解决了删除现有文件的问题:

echo $null >> filename

3
在命令提示符下也称为“ echo null> filename”,可能是批处理文件。很高兴看到它的PowerShell版本,谢谢!
马克·艾伦

16
如果文件已经存在,touch与此完全不同
jk。

9
回声是不必要的,$null > filename效果很好。
alirobe 2015年

8
这为我写了2个字节的Unicode BOM 0xFEFF。
mlt

4
重要说明:许多Unix工具不处理BOM。例如,这包括git(甚至在Windows上)。如果使用以这种方式创建的文件使用无法识别BOM的工具,将会遇到问题。例如,您尝试.gitignore使用此命令创建自己,并想知道为什么它不起作用。BOM是原因。
martixy

96

要创建一个空白文件:

New-Item -ItemType file example.txt

要更新文件的时间戳:

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

4
我认为这是最好的方法!
Jayesh Bhoot 2013年

这对更新文件夹的时间戳有用吗?
riahc3

1
@ riahc3,请使用:(gi MyFolder).LastWriteTime = Get-Date。您也可以将其用于文件。
dangph

9
更加精妙:ni example.txt
尼克·考克斯

2
此方法不会添加可怕的BOM字节,并且编码似乎是UTF-8。
达沃斯

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 2014年

14
非常非常微小的错误:尽管Touch-File符合PS的Verb-Noun命名约定,Touch却不是“批准的”动词(不是一个重要的要求:msdn.microsoft.com/en-us/library/ms714428。 aspx)。File很好,顺便说一句。我推荐名称Set-FileSet-LastWriteTime或者我最喜欢的名称Update-File。另外,我建议您Add-Content $file $null使用echo $null > $file。最后,设置有一个别名Set-Alias touch Update-File,如果你想使用命令让touch
阿兰·麦克比

建议将其添加为最后一行:New-Alias -Name Touch Touch-File
stimpy77

25

在PowerShell中,您可以创建类似的Touch函数,如下所示:

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

用法:

touch myfile.txt

资源


太好了,谢谢!正是我想要的!有什么想法可以将该功能安装到PowerShell中,以便在启动Shell时自动加载该功能吗?
jsalonen 2012年

2
将其添加到您的$ profile文件中。(运行记事本$ profile来编辑该文件。)
Mark Allen

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只是Format-Custom的别名 。我之所以选择它,是因为它是一条简短的命令,在这种情况下什么也不做, noop。这也很好,因为如果您忘记了重定向

fc filename

而不是给您一个错误,它什么也不做。其他有用的别名是

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

9

已经有很多有价值的答案,但是我非常喜欢New-Item的别名,它只是:ni

您也可以放弃文件类型声明(添加扩展名时我认为是隐式的),因此要在当前目录中创建名称为'x'的javascript文件,我可以简单地编写:

ni x.js

比触摸快3个字符!


这不是幂等的ni : 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是更改文件上LastWriteTime的最省力的方式(这是我需要的),尽管问题集中在touch命令的新文件创建功能上。
内森·哈特利2013年

不使用变量?
riahc3

5

打开您的个人资料文件:

notepad $profile

添加以下行:

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

保存并重新加载您的$ profile,以便立即使用。(无需关闭和打开PowerShell)

. $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 > $filefc >> $file,似乎也产生UTF-8文件。

Out-File $file -encoding utf8

给你一个UTF-8-BOM文件,而

Out-File $file -encoding ascii

给您一个UTF-8文件。Out-File支持的其他有效(但未经测试)编码是:[[--Encoding] {unknown | 字符串 unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | 默认值 oem}]。您还可以将内容通过管道传输到Out-File,以为文件提供一些文本数据来存储,以及-append标志。例如:

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做这项工作,它不会影响文件编码。同时检查的ss64版本touch
安东·克洛格洛夫

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,即如果文件名已经存在,则更新时间戳,但问题是用户只是想交互式地创建零尺寸的文件,而无需借助记事本。


1

我使用名称“ Write-File”,因为“ Touch”不是批准的PowerShell动词。不过,我仍然将其作为触摸的别名。

触摸.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 用于网络路径
  • VerboseDebugWhatIf标志
  • 通配符(仅时间戳更新)

New-Item在先前的四个答案中都提供了该命令。您已为其提供了20行包装器。您能否更清楚地说明您的解决方案与早期解决方案相比有哪些优势?例如,这些是什么VerboseDebug以及WhatIf标志等?
斯科特(Scott)

此答案之间的一个重要区别New-Item是更新了现有文件的时间戳。
jpaugh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.