web-dev-qa-db-ja.com

PowerShellで空のファイルを作成するためのLinuxの `touch`と同等ですか?

PowerShellにはtouchと同等のものがありますか?

たとえばLinuxでは、次のコマンドを呼び出すことで新しい空のファイルを作成できます。

touch filename

Windowsでは、これはかなり厄介です。通常、私は単にメモ帳の新しいインスタンスを開き、空のファイルを保存します。

では、PowerShellにこれを行うためのプログラム的な方法はありますか?

私はtouchの振る舞いを正確に一致させることを検討しているのではなく、単に空のファイルを作成するための最も簡単な方法を見つけることを目的としています。

160
jsalonen

追加リダイレクタ ">>"を使用すると、既存のファイルが削除される問題が解決されます。

echo $null >> filename
156
Yash Agarwal

空のファイルを作成するには

New-Item -ItemType file example.txt

ファイルのタイムスタンプを更新するには

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

これは、ファイルが存在しない場合は新しいファイルを作成し、存在する場合はタイムスタンプを更新するバージョンです。

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

PowerShellでは、次のような同様のタッチ機能を作成できます。

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

使用法:

touch myfile.txt

出典

25

私は好きです

fc > filename

このタスクのために。空でないファイルを扱うためにあなたは使うことができます

fc >> filename

fcは、 Format-Custom の単なるエイリアスです。これは、この文脈では何もしない短いコマンド、つまり noop であるため、これを選択しました。あなたがリダイレクトを忘れた場合それはまたいいです

fc filename

あなたにエラーを与える代わりに、ここでもまた何もしません。動作する他のいくつかのエイリアスは

ft -> Format-Table
fw -> Format-Wide
10
Steven Penny

価値ある答えはすでにたくさんありますが、New-Itemのエイリアスがとても好きです。

ファイルタイプの宣言(拡張子が追加されたときに暗黙的に定義されていると仮定します)をやめることもできます。そのため、現在のディレクトリに 'x'という名前のjavascriptファイルを作成します。

ni x.js

タッチよりも3文字早くなります!

8
Jacob E. Dawson

私はさまざまな情報源をまとめ、次のものを作成しました。それは私のニーズを満たしました。異なるタイムゾーンでマシン上に構築されたDLLの書き込み日を設定する必要がありました。

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

もちろん、複数のファイルに設定することもできます。

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

プロファイルファイルを開きます。

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
RafaelGP
ac file.txt $null

ファイルの内容は削除されませんが、日付も更新されません。

5
8DH

ここでの答えの多くはファイルのエンコードを説明していないようです。

他のさまざまな理由で、私はこの問題に遭遇したばかりですが、

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がサポートする他の有効な(しかしテストされていない)エンコーディングは以下の通りです。文字列ユニコードbigendianunicode | utf8 | utf7 | utf32 |アスキーデフォルトoem}]。ファイルに保存するテキストデータや-appendフラグを付けるために、Out-Fileにパイプで送ることもできます。例えば:

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

この例では、何らかの理由でタイムスタンプを更新しませんが、これは更新されます。

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

ただし、ファイルの末尾に「foo」を追加すると副作用があります。

あなたがどんなエンコーディングを持っているのかわからない場合は、私はVS - Codeは右下隅にそれがエンコーディングが何であるかを言う気の利いた機能があることがわかりました。 Notepad ++にも同様の機能があると思います。

5
Garret Hoffman

説明したシナリオ(ファイルが存在しない場合)では、これは迅速で簡単です。

PS> sc example.txt $null

ただし、touchの他の一般的な用途は、ファイルのタイムスタンプを更新することです。私のscの例をそのまま使用しようとすると、ファイルの内容が消去されます。

3
Jay Bazuzi

Webページ http://xahlee.info/powershell/PowerShell_for_unixer.html から、次のことがわかります。

new-item -type file [filename]

これは確かにサイズ0の新しいファイルを作成します。

これはUnixのtouchの他の機能、すなわちfilenameがすでに存在する場合にはタイムスタンプを更新することはしませんが、問題はユーザーが単にサイズ0のファイルを作成したいということです。メモ帳に頼ることなく対話的に。

2
ghostarbeiter

windowsで空のファイルを作成するための最も簡単な方法は次のとおりです。

fsutil file createnew file.name 0

ゼロはバイト単位のファイルサイズなので、これは大きなファイルを作成するのにも役立ちます(実際のデータが含まれず、ほとんど何も圧縮されないため、圧縮テストには役立ちません)。

2
Jon Carlstedt

「Touch」は 承認されたPowerShell動詞 ではないため、「Write-File」という名前を使用しました。私はまだタッチとしてそれをエイリアスします。

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
  • VerboseDebug、およびWhatIfのフラグ
  • ワイルドカード(タイムスタンプ更新のみ)
1
error