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

jsa*_*nen 238 windows powershell windows-8 powershell-3.0

touch在 PowerShell 中是否有等价物?

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

touch filename
Run Code Online (Sandbox Code Playgroud)

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

那么 PowerShell 中是否有一种编程方式来执行此操作?

我不希望完全匹配触摸行为,而只是为了找到创建空文件的最简单的等效项。

Yas*_*wal 216

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

echo $null >> filename
Run Code Online (Sandbox Code Playgroud)

  • echo 是不必要的,`$null > filename` 效果很好。 (22认同)
  • 如果文件已经存在,touch 与此大不相同 (19认同)
  • 这为我写入了 2 个字节的 unicode BOM 0xFEFF。 (16认同)
  • 重要提示:许多 unix 工具不处理 BOM。例如,这包括 git(甚至在 Windows 上)。如果您使用无法识别 BOM 的工具以这种方式创建的文件,您将会遇到问题。例如,您尝试使用此命令创建您的 `.gitignore`,并想知道为什么它不起作用。BOM 是原因。 (6认同)
  • 也称为命令提示符中的“echo null>filename”,可能是批处理文件。很高兴看到它的 PowerShell 版本,谢谢! (4认同)

dan*_*gph 162

要创建一个空白文件:

New-Item -ItemType file example.txt
Run Code Online (Sandbox Code Playgroud)

要更新文件的时间戳:

(gci example.txt).LastWriteTime = Get-Date
Run Code Online (Sandbox Code Playgroud)

  • 更简洁:`ni example.txt` (28认同)
  • 我认为这是最好的方法! (6认同)
  • 这种方法不会添加糟糕的 BOM 字节,并且编码似乎是 UTF-8。 (3认同)
  • @riahc3,使用这个:`(gi MyFolder).LastWriteTime = Get-Date`。您也可以将其用于文件。 (2认同)
  • 打更多高尔夫球以避免交互式对话框@NickCox:`ni -i file foo.txt` (2认同)

小智 88

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 非常非常微小的狡辩:虽然 Touch-File 符合 PS 的动词-名词命名约定,但`Touch` 不是一个“认可”的动词(并不是说这是一个重要的要求:https://msdn.microsoft.com/en -us/library/ms714428.aspx)。`文件`很好,顺便说一句。我推荐名称“Set-File”或“Set-LastWriteTime”,或者我最喜欢的“Update-File”。另外,我会推荐`Add-Content $file $null` 而不是`echo $null > $file`。最后,如果您想继续使用命令 `touch`,请使用 `Set-Alias touch Update-File` 设置别名 (18认同)
  • 这是复制 Unix touch 程序(尽管名称不同)的正确答案,但问题是简单地创建一个新文件。 (4认同)
  • 建议将其添加为最后一行:`New-Alias -Name Touch Touch-File` (2认同)
  • 很好,但最好使用 `New-Item $file` 而不是 `echo $null > $file`,因为后者将在 Windows PowerShell 中创建一个带有 UTF-16LE BOM 的 2 字节文件(但不再在 PowerShell 中)核)。 (2认同)
  • 这有一个 TOCTTOU 竞赛,可以在检查和操作之间创建文件。 (2认同)

Ƭᴇc*_*007 28

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

function touch {set-content -Path ($args[0]) -Value ($null)} 
Run Code Online (Sandbox Code Playgroud)

用法:

touch myfile.txt

来源

  • 如果文件存在,这将删除文件的内容。 (32认同)
  • 将其添加到您的 $profile 文件中。(运行记事本 $profile 来编辑该文件。) (3认同)
  • ...以及最终的单行版本也可以处理目录: `function touch {if((Test-Path -Path ($args[0])) -eq $false) {Set-Content -Path ($args [0]) -Value ($null)} else {(Get-Item ($args[0])).LastWriteTime = Get-Date } }` (3认同)
  • 或者不清除现有文件内容的安全版本`function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } }` (2认同)

Ste*_*nny 22

对于此任务,我更喜欢Format-Table(助记文件触摸):

ft > filename
Run Code Online (Sandbox Code Playgroud)

要处理非空文件,您可以使用:

ft >> filename
Run Code Online (Sandbox Code Playgroud)

我选择这个是因为它是一个简短的命令,在这种情况下什么都不做,一个 noop。这也很好,因为如果您忘记重定向:

ft filename
Run Code Online (Sandbox Code Playgroud)

而不是给你一个错误,它只是什么都不做。其他一些可以使用的别名是Format-Custom ( fc) 和Format-Wide ( fw)。


小智 19

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

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

ni x.js
Run Code Online (Sandbox Code Playgroud)

比触摸快 3 个字符!

  • 这不是幂等的`ni:文件'x.js'已经存在` (3认同)

Joh*_*ers 11

我把各种来源放在一起,最后得到了满足我需要的以下内容。我需要设置在不同时区的机器上构建的 DLL 的写入日期:

$update = get-date
Set-ItemProperty -Path $dllPath -Name LastWriteTime -Value $update
Run Code Online (Sandbox Code Playgroud)

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

Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update
Run Code Online (Sandbox Code Playgroud)


小智 8

看起来这里的一堆答案没有考虑文件编码。

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

echo $null > $file

$null > $file
Run Code Online (Sandbox Code Playgroud)

两者都产生一个 UTF-16-LE 文件,而

New-Item $file -type file
Run Code Online (Sandbox Code Playgroud)

生成一个 UTF-8 文件。

无论出于何种原因fc > $fileand fc >> $file,似乎也产生 UTF-8 文件。

Out-File $file -encoding utf8
Run Code Online (Sandbox Code Playgroud)

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

Out-File $file -encoding ascii
Run Code Online (Sandbox Code Playgroud)

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

echo $null | Out-File .\stuff.txt -Encoding ascii -Append
Run Code Online (Sandbox Code Playgroud)

由于某种原因,此示例不会更新时间戳,但此示例会:

echo foo | Out-File .\stuff.txt -Encoding ascii -Append
Run Code Online (Sandbox Code Playgroud)

尽管它确实具有将“foo”附加到文件末尾的副作用。

如果你不确定你有什么编码,我发现 VS-Code 有一个很好的功能,它在右下角说明了编码是什么。我认为 Notepad++ 也有类似的功能。


小智 7

打开您的个人资料文件:

notepad $profile
Run Code Online (Sandbox Code Playgroud)

添加以下行:

function touch {New-Item "$args" -ItemType File}
Run Code Online (Sandbox Code Playgroud)

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

. $profile
Run Code Online (Sandbox Code Playgroud)

要在当前目录类型中添加新文件:

touch testfile.txt
Run Code Online (Sandbox Code Playgroud)

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

touch myfolder\testfile.txt
Run Code Online (Sandbox Code Playgroud)

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

我希望它有帮助

奖金提示:

您可以添加以下行,使其等效于 'mkdir':

function mkdir {New-Item "$args" -ItemType Directory} 
Run Code Online (Sandbox Code Playgroud)

同样的用法:

mkdir testfolder
mkdir testfolder\testsubfolder
Run Code Online (Sandbox Code Playgroud)


8DH*_*8DH 6

ac file.txt $null
Run Code Online (Sandbox Code Playgroud)

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