PowerShell을 사용하여 빈 파일을 만드는 Linux 'touch'에 해당합니까? [복제]


163

이 질문에는 이미 답변이 있습니다.

PowerShell에는 touch?에 해당하는 것이 있습니까?

예를 들어 Linux에서는 다음을 호출하여 빈 파일을 새로 만들 수 있습니다.

touch filename

Windows에서 이것은 매우 어색합니다. 일반적으로 새 메모장 인스턴스를 열고 빈 파일을 저장합니다.

PowerShell에 프로그래밍 방식이 있습니까?

터치 동작과 정확히 일치하는 것이 아니라 빈 파일을 만드는 가장 간단한 방법을 찾고 있습니다.



감사. 나는 그것들을 보았지만 대부분의 대답은 명령 프롬프트에 중점을 둡니다. 새 응용 프로그램을 설치할 필요가없는 PowerShell 솔루션을 갖고 싶습니다.
jsalonen

의문의 여지가 있지만, 두 기능 모두 코드가 몇 줄 밖에 없으며, 절반 만 아니라 두 가지를 모두 구현하면됩니다. 빠진 다른 명령이 너무 위험 할 때.
yzorg 's

@ yzorg : 두 기능의 의미는 무엇입니까? 나는 당신이 touch리눅스에서 할 수있는 방법으로 PS에서 빈 파일을 만드는 방법 만 묻고있었습니다 .
jsalonen

@jsalonen touch기존 파일에서 * nix 를 사용 하면 파일을 수정하지 않고 마지막 쓰기 시간을 업데이트합니다. @amiregelz의 링크를 참조하십시오. 이 질문은에 대한 Google 순위가 높습니다. powershell touch복사 / 붙여 넣기 사용자에게 * nix touch가 그렇지 않은 경우 절반 만 데이터를 파괴 할 수 있음을 경고하고 싶습니다. 파일이 이미 존재하는 경우 처리하는 @LittleBoyLost 답변을 참조하십시오.
yzorg 's

답변:


161

추가 리디렉터 ">>"를 사용하면 기존 파일이 삭제되는 문제가 해결됩니다.

echo $null >> filename

3
명령 프롬프트에서 배치 파일 인 'echo null> filename'이라고도합니다. PowerShell 버전을 사용해 주셔서 감사합니다. 감사합니다.
Mark Allen

16
파일이 이미 존재하는 경우 터치는 이것과 다소 다릅니다
jk.

9
에코는 불필요하고 $null > filename훌륭하게 작동합니다.
alirobe

8
이것은 2 바이트의 유니 코드 BOM 0xFEFF를 작성합니다.
mlt

4
중요 사항 : 많은 유닉스 도구는 BOM을 다루지 않습니다. 여기에는 git이 포함됩니다 (Windows에서도). 이러한 방식으로 작성된 파일을 BOM을 인식하지 못하는 도구와 함께 사용하면 문제가 발생합니다. 예를 들어이 .gitignore명령을 사용하여 생성하려고 시도하고 왜 작동하지 않는지 궁금합니다. BOM이 이유입니다.
martixy

92

빈 파일을 만들려면

New-Item -ItemType file example.txt

파일의 타임 스탬프를 업데이트하려면

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

4
이것이 최선의 방법이라고 생각합니다!
Jayesh Bhoot

폴더의 타임 스탬프를 업데이트 할 수 있습니까?
riahc3

1
@ riahc3, 이것을 사용하십시오 : (gi MyFolder).LastWriteTime = Get-Date. 파일에도 사용할 수 있습니다.
dangph

9
더 화끈한 :ni example.txt
닉 콕스

2
이 방법은 끔찍한 BOM 바이트를 추가하지 않으며 인코딩은 행복하게 UTF-8로 보입니다.
Davos

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 프로그램 복제에 대한 정답이지만 질문은 단순히 새 파일을 작성하는 것입니다.
Jamie Schembri

13
아주, 아주 작은 애매한는 : 터치 파일은 PS의 동사 - 명사 명명 규칙을 준수하지만, Touch그것이 중요한 요구 사항입니다하지 않는 것이 (AN이 동사를 "승인"되지 않습니다 : msdn.microsoft.com/en-us/library/ms714428. aspx ). File괜찮아, btw. 이름 Set-File이나 Set-LastWriteTime내가 가장 좋아하는 것을 추천합니다 Update-File. 또한 Add-Content $file $null대신에 권장 합니다 echo $null > $file. 마지막으로, Set-Alias touch Update-File명령을 계속 사용하려면 별명을 설정 하십시오touch
Alan McBee

25

PowerShell에서 다음과 유사한 Touch 기능을 만들 수 있습니다.

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

용법:

touch myfile.txt

출처


감사합니다! 내가 원하는 것! 쉘을 시작할 때 자동으로로드되도록이 기능을 PowerShell에 설치하는 방법에 대한 아이디어가 있습니까?
jsalonen

2
$ profile 파일에 추가하십시오. (메모장 $ profile을 실행하여 해당 파일을 편집하십시오.)
Mark Allen

25
존재하는 경우 파일의 내용을 삭제합니다.
dangph

1
또는 기존 파일 내용을 지우지 않는 안전한 버전 function touch { if((Test-Path -Path ($args[0])) -eq $false) { set-content -Path ($args[0]) -Value ($null) } }
alastairtree

10

나는 선호한다

fc > filename

이 작업을 위해. 비어 있지 않은 파일로 작업하려면

fc >> filename

fc단순히 Format-Custom 의 별명입니다 . 나는이 문맥에서 아무것도하지 않는 짧은 명령 인 noop 이므로 그것을 선택했습니다 . 리디렉션을 잊어 버린 경우에도 좋습니다.

fc filename

오류를주는 대신 다시는 아무것도하지 않습니다. 작동 할 다른 별칭은 다음과 같습니다.

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

9

이미 가치있는 답변이 많이 있지만 New-Item의 별칭을 좋아합니다.

파일 형식 선언을 잊어 버릴 수도 있습니다 (확장자가 추가 될 때 암시 적이라고 생각합니다). 현재 디렉토리에 이름이 'x'인 자바 스크립트 파일을 만들려면 간단히 쓸 수 있습니다.

ni x.js

터치보다 3 자 빠름!


이것은 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
터치 명령의 새로운 파일 생성 기능에 중점을 두었지만 파일에서 LastWriteTime을 변경하는 가장 Powershell-ish 방법의 경우 +1입니다 (필요한 것임).
Nathan Hartley 2013

변수를 사용하지 않고?
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 >> $fileUTF-8 파일도 생성하는 것으로 보입니다.

Out-File $file -encoding utf8

UTF-8-BOM 파일을 제공하면서

Out-File $file -encoding ascii

UTF-8 파일을 제공합니다. Out-File이 지원하는 다른 유효한 (그러나 테스트되지 않은) 인코딩은 다음과 같습니다. [[-Encoding] {unknown | 문자열 | 유니 코드 | 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에는 오른쪽 하단 모서리에 인코딩이 무엇인지 알려주는 멋진 기능이 있습니다. 메모장 ++에도 비슷한 기능이 있다고 생각합니다.


Set-Content -Path $file -value $null작업을 수행하며 파일 인코딩에 영향을 미치지 않습니다. 의 ss64 버전touch 도 확인하십시오 .
Anton Krouglov

3

설명한 시나리오 (파일이 존재하지 않는 경우)의 경우 빠르고 쉽습니다.

PS> sc example.txt $null

그러나 다른 일반적인 용도 touch는 파일의 타임 스탬프를 업데이트하는 것입니다. 내 sc예제를 그런 식 으로 사용하려고 하면 파일의 내용이 지워집니다.


1
감사! 무슨 sc뜻입니까? 편집 : 이해 ( "콘텐츠 설정")
jsalonen

2

Windows에서 빈 파일을 만들려면 빠른 방법은 다음과 같습니다.

fsutil file createnew file.name 0

0은 바이트 단위의 파일 크기이므로 큰 파일을 만드는 데 유용합니다 (실제 데이터를 포함하지 않고 거의 아무것도 압축하지 않기 때문에 압축 테스트에는 유용하지 않습니다)


2

웹 사이트 http://xahlee.info/powershell/PowerShell_for_unixer.html 은 다음을 제안합니다.

new-item -type file [filename]

그리고 이것은 실제로 크기가 0 인 새 파일을 만듭니다.

이것은 Unix의 다른 기능을 수행하지 않습니다 touch. 즉, 파일 이름이 이미 존재하는 경우 타임 스탬프를 업데이트 하지만 질문은 사용자가 메모장을 사용하지 않고 대화식으로 크기가 0 인 파일을 만들고 싶어한다는 것을 암시합니다.


1

"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 네트워크 경로
  • Verbose, DebugWhatIf플래그
  • 와일드 카드 (타임 스탬프 업데이트 만 해당)

New-Item명령은 네 가지 이전 답변으로 제공되었습니다. 이를 위해 20 줄 래퍼를 제공했습니다. 솔루션이 이전 솔루션보다 어떤 이점을 가지고 있는지 좀 더 명확하게 설명 할 수 있습니까? 예를 들어,이 무엇인가 Verbose, Debug그리고 WhatIf플래그 등?
Scott

이 답변과의 중요한 차이점 중 하나 New-Item는 기존 파일의 타임 스탬프를 업데이트한다는 것입니다.
jpaugh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.