在PowerShell中有一个等效的touch吗?

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

touch filename


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

那么在PowerShell中有编程方式可以做到这一点吗?

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

评论

请参阅Windows版本的Unix touch命令和Windows版本的Linux命令“ touch”?

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

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

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

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

#1 楼

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

echo $null >> filename


评论


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

–马克·艾伦(Mark Allen)
2012年11月7日在21:11

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

– jk。
2012年11月7日在22:46



echo是不必要的,$ null> filename效果很好。

– alirobe
15年5月30日在12:54

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

– mlt
16年4月20日在19:08

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

–martixy
17年7月31日在22:21



#2 楼

创建空白文件:

 New-Item -ItemType file example.txt
 


要更新文件的时间戳,请执行以下操作:

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


评论


我认为这是最好的方法!

–Jayesh Bhoot
13年4月4日在15:30

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

–dangph
15年7月28日在11:26



更精妙的是:ni example.txt

–尼克·考克斯(Nick Cox)
17年12月21日在1:03

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

–达沃斯
18 Mar 26 '18在10:33

为了避免使用交互式对话框@NickCox,还进行了更多操作:ni -i文件foo.txt

–谐音
20 Mar 27 '20 at 20:59

#3 楼

这是一个版本,如果不存在则创建一个新文件,如果存在则更新时间戳。

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


评论


这是复制Unix touch程序(尽管名称不同)的正确答案,但问题仅在于创建一个新文件。

–贾米·塞姆布里(Jamie Schembri)
2014年1月4日,11:59



非常非常微小的错误:Touch-File符合PS的Verb-Noun命名约定,而Touch不是“批准的”动词(不是一个重要的要求:msdn.microsoft.com/zh-cn/library/ms714428 .aspx)。文件很好,顺便说一句。我建议使用名称Set-File或Set-LastWriteTime或我最喜欢的Update-File。另外,我建议添加内容$ file $ null而不是echo $ null> $ file。最后,如果您想继续使用命令touch,请使用Set-Alias touch Update-File设置别名。

–艾伦·麦克比(Alan McBee)
17年5月25日在23:36

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

–stimpy77
19-10-1在4:33

很好,但是最好使用New-Item $ file而不是echo $ null> $ file,因为后者将在Windows PowerShell中使用UTF-16LE BOM创建一个2字节的文件(但不再在PowerShell Core中)。

–mklement0
19年11月5日,12:43

这是一个TOCTTOU竞赛,可以在检查和操作之间创建文件。

– poizan42
19/12/27在13:43

#4 楼

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

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


用法:

touch myfile.txt



评论


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

– jsalonen
2012年11月7日19:34



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

–马克·艾伦(Mark Allen)
2012年11月7日在21:12

这将删除文件的内容(如果存在)。

–dangph
13年1月24日在6:31

或无法清除现有文件内容的安全版本,请触摸{{if((Test-Path -Path($ args [0]))-eq $ false){set-content -Path($ args [0])-值($ null)}}

–alastairtree
'18 Sep 11'在16:51



...以及可以处理目录的最终一线版本:function touch {if(((Test-Path -Path($ args [0]))-eq $ false){Set-Content -Path($ args [ 0])-Value($ null)}否则{(Get-Item($ args [0]))。LastWriteTime = Get-Date}}

–not2qubit
20-09-24在8:05

#5 楼

我更喜欢使用Format-Table来完成此任务(助记符文件触摸):在这种情况下不执行任何操作的简短命令,
noop。这样做也很不错,因为如果您忘记了重定向:
ft > filename

并不会给您带来错误,而是不会执行任何操作。其他可用的别名
是“格式自定义”(fc)和“格式宽”(fw)。

#6 楼

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

您也可以放弃文件类型声明(我假设在扩展名已添加),因此要在当前目录中创建名称为'x'的javascript文件,我可以简单地写: />

评论


这不是幂等ni:文件'x.js'已经存在

–史蒂芬·潘妮(Steven Penny)
17年11月30日在12:43

幂等价等效于ac x.js $ null

–尼克·考克斯(Nick Cox)
20 Mar 29 '20在5:02

这与触摸有何不同?

–尼古拉斯·桑德斯(Nicholas Saunders)
20 Dec 20 '18:45

#7 楼

我汇总了各种资料,并整理出满足我需求的以下资料。我需要设置在不同时区的计算机上构建的DLL的写入日期:

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


当然,您也可以为多个文件设置它:

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


评论


+1是更改文件上LastWriteTime的最省力的方式(这是我需要的),尽管问题集中在touch命令的新文件创建功能上。

–内森·哈特利
13年2月25日在15:20



不使用变量?

–riahc3
15年7月28日在6:33

#8 楼

看来这里的答案不是一堆文件编码。

由于其他各种原因,我只是遇到了这个问题,但是

>
都生成UTF-16-LE文件,而

echo $null > $file

$null > $file


生成UTF-8文件。

原因fc > $filefc >> $file似乎也生成UTF-8文件。

New-Item $file -type file


为您提供UTF-8-BOM文件,而
Out-File $file -encoding utf8


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

Out-File $file -encoding ascii


由于某些原因,此示例未更新时间戳,但此示例却更新了:

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


尽管它确实具有将“ foo”附加到文件末尾的副作用。功能在右下角的位置说明编码是什么。我认为Notepad ++也具有类似的功能。

评论


Set-Content -Path $ file -value $ null可以完成此工作,并且不影响文件编码。同时检查ss64版本的touch。

–安东·克鲁格洛夫(Anton Krouglov)
17 Mar 14 '15:18



是的,不幸的是,在Windows PowerShell中,$ null> $ file创建了一个具有UTF-16LE编码的2字节文件。幸运的是,在PowerShell Core中,您现在得到的是一个真正的空文件,就像在两个版本中都使用New-Item一样。但是,将一个真正的空文件(长度为0字节)表示为具有特定字符编码(例如UTF-8)并没有意义。字符编码仅对内容有意义(此处不提供),更具体地说,对文本内容而言才有意义。

–mklement0
19年11月5日在13:04

#9 楼

ac file.txt $null


不会删除文件内容,但也不会更新日期。

#10 楼

打开您的配置文件:

notepad $profile


添加以下行:

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


保存并重新加载$配置文件以便立即使用。 (无需关闭和打开Powershell)

. $profile


要在当前目录中添加新文件,请输入以下类型:

touch testfile.txt


要在“ myfolder”目录中添加新文件,请输入:

touch myfolder\testfile.txt


如果已经存在同名文件,则不会被覆盖。取而代之的是您会得到一个错误。以下行:

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


相同用途:

mkdir testfolder
mkdir testfolder\testsubfolder


#11 楼

对于您所描述的情况(文件不存在时),这是快速简便的:

文件的时间戳。如果您尝试以这种方式使用我的touch示例,它将删除文件的内容。

评论


谢谢! sc是什么意思?编辑:弄清楚(“设置内容”)

– jsalonen
2013年2月27日15:00



#12 楼

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

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用于网络路径

VerboseDebugWhatIf标志
通配符(仅时间戳更新)


评论


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

–斯科特
17 Mar 23 '17 at 4:08

此答案与New-Item之间的一个重要区别是,这将更新现有文件的时间戳。

– jpaugh
18年7月26日在15:49

由于某种原因,我必须总是一次又一次地导入模块,这不应该发生,对Import-Module ./Touch.psm1

–珍贵
19年11月4日在21:15

@shirish您需要在每个会话中导入模块,是的,除非您将其放在PSModulePath的文件夹中。 (或将其文件夹添加到PSModulePath。)

– SilverbackNet
20-2-28在20:36



#13 楼

要在Windows中创建一个空文件,斋戒的方法如下:因为它们不包含实际数据,并且将压缩到几乎没有任何内容,所以对于测试压缩没有用。

#14 楼

网页http://xahlee.info/powershell/PowerShell_for_unixer.html建议:

new-item -type file [filename]


,这的确创建了一个零大小的新文件。
这不执行Unix touch的其他功能,即如果文件名已经存在,则更新时间戳,但问题是用户只是想交互式地创建零大小的文件,而无需借助记事本。 />