在PowerShell中有一个等效的
touch
吗?例如在Linux中,我可以通过调用以下命令创建一个新的空文件:
touch filename
在Windows上,这很尴尬-通常我只是打开一个记事本的新实例并保存一个空文件。
那么在PowerShell中有编程方式可以做到这一点吗?
我不是要完全匹配触摸行为,而是要找到创建空文件的最简单等效方法。
#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 > $file
和fc >> $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
用于网络路径Verbose
,Debug
和WhatIf
标志通配符(仅时间戳更新)
评论
在先前的四个答案中都提供了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
的其他功能,即如果文件名已经存在,则更新时间戳,但问题是用户只是想交互式地创建零大小的文件,而无需借助记事本。 />
评论
请参阅Windows版本的Unix touch命令和Windows版本的Linux命令“ touch”?谢谢。我看了看它们,但是大多数答案都集中在命令提示符上。我想要一个不需要我安装新应用程序的PowerShell解决方案。
否定了这个问题-这两个功能仅是几行代码,仅实现两者,而不仅仅是实现一半。当缺少的另一半命令如此危险时。
@yzorg:这两个功能分别代表什么?我只是问如何在Linux中以触摸方式创建PS中的空文件。
@jsalonen在现有文件上使用* nix touch,它将在不修改文件的情况下更新上次写入时间,请参阅@amiregelz中的链接。这个问题在Powershell Touch上的google排名很高,我想提醒复制者/粘贴者,当* nix touch不能使用时,只有一半会破坏数据。请参阅@LittleBoyLost答案,该答案将在文件已存在时进行处理。