2012-11-07 19:28:02 +0000 2012-11-07 19:28:02 +0000
180
180

相当于Linux`touch`用PowerShell创建一个空文件?

例如,在Linux中,我可以通过调用:

touch filename

来创建一个新的空文件,而在Windows中,这是很尴尬的–通常我只是打开一个新的记事本实例并保存一个空文件。

那么在PowerShell中是否有一种程序化的方法来实现这个功能呢?

我并不希望完全与 touch 的行为相匹配,只是想为创建空文件找到一个最简单的等价物。

答案 (14)

171
171
171
2012-11-07 19:36:41 +0000

使用追加重定向器">>“可以解决现有文件被删除的问题。

echo $null >> filename
113
113
113
2013-01-24 06:39:09 +0000

要创建一个空白文件。

New-Item -ItemType file example.txt

更新文件的时间戳:

(gci example.txt).LastWriteTime = Get-Date
78
78
78
2013-03-25 12:47:36 +0000

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

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
    }
}
24
24
24
2012-11-07 19:32:59 +0000

在PowerShell中,你可以创建一个类似的Touch函数,如。

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

使用方法:

touch myfile.txt Source

14
14
14
2014-09-30 05:10:25 +0000

我更喜欢用

fc > filename

来完成这个任务。要处理非空文件,你可以使用

fc >> filename

fc只是 Format-Custom 的别名。我选择它是因为它是一个简短的命令,在这种情况下什么都不做, noop 。它也很好,因为如果你忘记了重定向

fc filename

,而不是给你一个错误,同样它只是什么都不做。其他可以使用的别名有

ft -> Format-Table
fw -> Format-Wide
```。
11
11
11
2017-06-15 16:45:40 +0000

已经有一堆值得参考的答案了,但我很喜欢New-Item的别名,就是:ni

你也可以放弃文件类型声明(我认为当添加扩展名时,文件类型声明是隐含的),所以要在我当前的目录下创建一个名字为'x'的javascript文件,我可以简单地写。

ni x.js

3个字符,比触摸还快!

8
8
8
2013-01-26 00:33:10 +0000

我把各种资源整合在一起,最后得到了以下的结果,满足了我的需求。我需要设置一个在不同时区的机器上建立的DLL的写入日期:

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

当然,你也可以为多个文件设置。

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update
6
6
6
2017-03-08 23:30:09 +0000

看来这里的一堆答案都没有考虑到文件编码的问题。

我刚碰到这个问题,因为其他各种原因,但

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 | string | unicode | bigendianunicode | utf8 | utf7 | utf32 | ascii | default | 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++也有类似的功能。

5
5
5
2013-03-08 12:47:19 +0000

打开你的profile文件。

notepad $profile

添加以下一行:

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

保存它并重新加载你的$profile以便直接使用它。(不需要关闭和打开 powershell)

. $profile

要在当前目录下添加一个新文件,请输入:

touch testfile.txt

保存它并重新加载你的 $profile,以便直接使用。

touch myfolder\testfile.txt

在 “myfolder "目录类型中添加新文件。

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

如果一个同名的文件已经存在,它不会被覆盖。相反,你会得到一个错误。

希望对你有帮助

附加提示:

你可以让'mkdir'等价于添加以下一行:

mkdir testfolder
mkdir testfolder\testsubfolder

同样的用法。

0x1& 同样的用法:

0x1&

5
5
5
2013-08-12 12:52:52 +0000
ac file.txt $null

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

3
3
3
2013-02-25 22:19:10 +0000

对于你所描述的情况(当文件不存在时),这很简单快捷:

PS> sc example.txt $null

然而,touch的另一个常见用法是更新文件的时间戳。如果你试着用我的sc的例子,就会删除文件的内容。

2
2
2
2015-11-02 14:58:44 +0000

在windows中创建一个空文件,最快捷的方法是如下。

2
2
2
2016-05-06 06:21:30 +0000

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

new-item -type file [filename]

这确实会创建一个大小为0的新文件。

这并没有执行Unix touch的另一个功能,即如果filename已经存在,则更新时间戳,但这个问题意味着用户只是想交互式地创建一个零大小的文件,而不需要借助记事本。

2
2
2
2017-03-22 17:21:01 +0000

我使用了 “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

Usage:

Import-Module ./Touch.psm1
touch foo.txt

支持。

  • 其他目录中的路径
  • 网络路径的 Credential
  • VerboseDebugWhatIf 标志
  • 通配符 (仅时间戳更新)