PowerShellで空のファイルを作成するLinuxの`touch`に相当する?
PowerShellにはtouch
に相当するものはありますか?
例えばLinuxでは、
touch filename
を実行することで、新しい空のファイルを作成することができます。
0x1&
Windowsではこれはかなり厄介です。
私はtouchの動作を正確に一致させようとしているわけではなく、空のファイルを作成するための最もシンプルな同等の方法を探しているだけです。
PowerShellにはtouch
に相当するものはありますか?
例えばLinuxでは、
touch filename
を実行することで、新しい空のファイルを作成することができます。
0x1&
Windowsではこれはかなり厄介です。
私はtouchの動作を正確に一致させようとしているわけではなく、空のファイルを作成するための最もシンプルな同等の方法を探しているだけです。
append redirector “>>>"を使用することで、既存のファイルが削除されてしまう問題を解決しました。
echo $null >> filename
ここでは、ファイルが存在しない場合は新しいファイルを作成し、存在する場合はタイムスタンプを更新します。
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
}
}
このタスクには、
fc > filename
を使います。空でないファイルを扱うには、
fc >> filename
fc
を使うことができます。私がこれを選んだのは、このコンテキストでは何もしない短いコマンドである noop だからです。また、リダイレクト
fc filename
を忘れてしまった場合、エラーになる代わりに何もしないからです。他にも、
ft -> Format-Table
fw -> Format-Wide
0x1& といったエイリアスが動作します。
すでにたくさんの価値ある回答がありますが、私はNew-Itemのエイリアスがとても気に入っています: ni
ファイルタイプの宣言を省略することもできます(これは拡張子が追加されたときに暗黙の了解を得ていると思います)。
ni x.js
3文字で、タッチよりも早く作成できます。
いろいろなソースをまとめてみたところ、以下のようなものが私のニーズに合っていました。
$update = get-date
Set-ItemProperty -Path $dllPath -Name LastWriteTime -Value $update
もちろん、複数のファイルに対して設定することもできます。
Get-ChildItem *.dll | Set-ItemProperty -Name LastWriteTime -Value $update
ここでの回答の多くはファイルエンコーディングを考慮していないようです。
echo $null > $file
$null > $file
はどちらも UTF-16-LE ファイルを生成しますが、
New-Item $file -type file
は UTF-8 ファイルを生成します。
なぜか fc > $file
と fc >> $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” を追加するという副作用がありますが、この例では更新されています。 メモ帳++にも似たような機能があると思います。
プロファイルファイルを開きます。
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}
PS> sc example.txt $null
しかし、touch
の他の一般的な使い方は、ファイルのタイムスタンプを更新することです。私の sc
の例をそのように使おうとすると、ファイルの内容が消去されてしまいます。
を実行して空のファイルを作成するには、次のようにするのが一番早い方法です。
ウェブページ http://xahlee.info/powershell/PowerShell_for_unixer.html が提案しています。
new-item -type file [filename]
これは確かにサイズゼロの新しいファイルを作成します。
これはUnix touch
のもう一つの機能、つまりfilenameが既に存在する場合にタイムスタンプを更新するという機能を果たしていませんが、この質問はユーザがメモ帳に頼らずに対話的にゼロサイズのファイルを作成したいだけだということを暗示しています。
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
Verbose
, Debug
, WhatIf
, 0x6& フラグ