PowerShellで空のファイルを作成するLinuxの `touch`と同等ですか?[複製]


167

この質問にはすでに答えがあります:

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

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

touch filename

Windowsでは、これはかなり厄介です。通常、メモ帳の新しいインスタンスを開いて空のファイルを保存するだけです。

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

タッチの動作を正確に一致させるのではなく、空のファイルを作成するための可能な限り単純な同等のものを探しています。



ありがとう。私はそれらを見ましたが、答えのほとんどはコマンドプロンプトに焦点を当てています。新しいアプリケーションをインストールする必要のないPowerShellソリューションが必要です。
jsalonen

質問にダウンボット-両方の機能はほんの数行のコードであり、特に半分だけではなく、両方を実装するだけです。欠けている他の半分のコマンドがとても危険なとき。
yzorg 14

@yzorg:両方の機能はどういう意味ですか?touchLinuxでできる方法でPSに空のファイルを作成する方法だけを尋ねていました。
jsalonen

@jsalonen touch既存のファイルで* nix を使用すると、ファイルを変更せずに最終書き込み時間が更新されます。@ amiregelzのリンクを参照してください。この質問はのGoogleランキングが高いためpowershell touch、* nix touchではそうではないが、この半分だけがデータを破壊できることをコピー/貼り付け者に警告したかったのです。ファイルが既に存在する場合に処理する@LittleBoyLostの回答を参照してください。
yzorg

回答:


165

アペンドリダイレクタ「>>」を使用すると、既存のファイルが削除される問題が解決します。

echo $null >> filename

3
コマンドプロンプトからの 'echo null> filename'とも呼ばれます。バッチファイルの場合もあります。PowerShellバージョンを見るのは素晴らしいです、ありがとう!
マークアレン

16
ファイルが既に存在する場合のタッチはこれよりもかなり異なっている
JK。

9
エコーは不要で、$null > filenameうまく機能します。
アリローブ

8
これにより、2バイトのUnicode BOM 0xFEFFが書き込まれます。
mlt

4
重要な注意:多くのUNIXツールはBOMを扱いません。これには、たとえばgitが含まれます(Windowsでも)。この方法で作成されたファイルをBOMを認識しないツールで使用すると、問題が発生します。たとえば、.gitignoreこのコマンドを使用して作成しようとすると、なぜ機能しないのか疑問に思います。BOMが理由です。
-martixy

96

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

New-Item -ItemType file example.txt

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

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

4
これが最善のアプローチだと思います!
Jayesh Bhoot

これは、フォルダーのタイムスタンプを更新するために機能しますか?
riahc3

1
@ riahc3、これを使用します(gi MyFolder).LastWriteTime = Get-Date。ファイルにも使用できます。
ダンフ

9
さらに簡潔:ni example.txt
ニックコックス

2
このメソッドはひどいBOMバイトを追加せず、幸いエンコーディングはUTF-8のように見えます。
ダボス

75

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

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

4
これは、Unix touchプログラムを複製するための正しい答えです(名前は異なります)が、質問は単に新しいファイルを作成することです。
ジェイミーシェムブリ14年

14
非常小さなごまかし:Touch-FileはPSの動詞と名詞の命名規則に準拠してTouchいますが、「承認された」動詞ではありません(重要な要件であるmsdn.microsoft.com/en-us/library/ms714428ではありません)。 aspx)。File結構です 名前Set-FileSet-LastWriteTimeまたは、私のお気に入りをお勧めしますUpdate-File。また、Add-Content $file $null代わりにをお勧めしますecho $null > $file。最後に、Set-Alias touch Update-Fileコマンドを使用し続ける場合は、エイリアスを設定しますtouch
アランマクビー

:最後の行としてこれを追加することをお勧めNew-Alias -Name Touch Touch-File
stimpy77

25

PowerShellでは、同様のTouch関数を作成できます。

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

使用法:

touch myfile.txt

ソース


これは素晴らしい、ありがとう!私が欲しかったもの!この関数をPowerShellにインストールして、シェルを起動したときに自動的に読み込まれるようにする方法はありますか?
jsalonen

2
$ profileファイルに追加します。(メモ帳の$ profileを実行して、そのファイルを編集します。)
マークアレン

25
これにより、ファイルの内容が存在する場合は削除されます。
ダンフ

1
または、既存のファイルの内容を消去しない安全なバージョン function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } }
alastairtree

13

私は好む

fc > filename

このタスクのため。空でないファイルを操作するには、次を使用できます

fc >> filename

fcは単にFormat-Customのエイリアスです 。このコンテキストでは何もしない短いコマンドであるnoopであるため、これを選択し ました。リダイレクトを忘れると

fc filename

エラーを与える代わりに、何もしません。動作する他のエイリアスは次のとおりです。

ft -> Format-Table
fw -> Format-Wide

9

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

また、ファイルタイプの宣言(拡張子が追加されると暗黙的に想定される)を省略することができるため、現在のディレクトリに 'x'という名前のjavascriptファイルを作成するには、次のように記述します。

ni x.js

タッチよりも3文字速い!


これはi等ではありませんni : The file 'x.js' already exists
スティーブンペニー

8

私はさまざまなソースをまとめ、次のようにまとめました。それは私のニーズを満たしました。別のタイムゾーンのマシンでビルドされたDLLの書き込み日付を設定する必要がありました。

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

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

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

1
+1は、ファイルのLastWriteTimeを変更する最もPowershell的な方法(これが必要なものです)ですが、質問はタッチコマンドの新しいファイル作成機能に焦点を当てています。
ネイサンハートリー

変数を使用せずに?
riahc3

5

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

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

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


5

ここでの回答の多くは、ファイルのエンコードを考慮していないようです。

他のさまざまな理由でこの問題に遭遇しましたが、

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}]。また、ファイルを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 ++にも同様の機能があると思います。


Set-Content -Path $file -value $nullジョブを実行し、ファイルのエンコードには影響しません。のss64バージョンtouchも確認してください。
アントンクルーグロフ

3

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

PS> sc example.txt $null

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


1
ありがとう!どういうsc意味ですか?編集:それを考え出した(「セットコンテンツ」)
jsalonen

2

Windowsで空のファイルを作成するには、fastesの方法は次のとおりです。

fsutil file createnew file.name 0

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


2

Webページhttp://xahlee.info/powershell/PowerShell_for_unixer.htmlは以下を示唆しています。

new-item -type file [filename]

これにより、サイズがゼロの新しいファイルが実際に作成されます。

これはUnixの他の機能touch、つまりファイル名が既に存在する場合はタイムスタンプを更新しませんが、質問は、ユーザーがメモ帳に頼らずに対話的にゼロサイズのファイルを作成したいことを示唆しています。


1

「Touch」は承認されたPowerShell動詞ではないため、「Write-File」という名前を使用しました。ただし、私はまだ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コマンドは、以前の4つの回答で提供されています。20行のラッパーを提供しました。ソリューションが以前のソリューションよりも優れている点をもう少し明確に説明できますか?例えば、これらは何をしているVerboseDebugそして、WhatIfなど、フラグ?
スコット

この答えとNew-Item、既存のファイルのタイムスタンプを更新することとの重要な違いの1つです。
-jpaugh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.