Antoni Parellada
Antoni Parellada

Reputation: 4791

Creating new file with touch command in PowerShell error message

I have a directory on my desktop created using PowerShell, and now I'm trying to create a text file within it.

I did change directory to the new one, and typed touch textfile.txt.

This is the error message I get:

touch : The term 'touch' is not recognized as the name of a cmdlet, function, 
script file, or operable program. Check the spelling of the name, or if a path was 
included, verify that the path is correct and try again.

At line:1 char:1
+ touch file.txt
+ ~~~~~
+ CategoryInfo          : ObjectNotFound: (touch:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException`

Why is it not working? Will I have to use Git Bash all the time?

Upvotes: 27

Views: 68780

Answers (14)

tedro
tedro

Reputation: 71

Put this in your Windows pwsh profile and reload

function touch ($myNewFileName) { New-Item $myNewFileName -type file }

touch seems to work in pwsh OOB in MacOS

Upvotes: 0

Niederee
Niederee

Reputation: 4295

I like to extend the function to create a non-existing folder by default. If you want the traditional behavior providing the option is nice.

function touch {
  param([string]$Name,
    [switch]$Traditional)
  if (-not $Traditional) {
    $names = $Name.Replace("\", "/").Replace("//", "/") -split "/"
    $nameNormalized = $names -join "/"
    $nameNormalized = $nameNormalized.TrimEnd($names[$names.count - 1]).TrimEnd("/")
    if (-not (Test-Path $nameNormalized) -and ($names.count -gt 1)) {      
      New-Item -Path $nameNormalized -ItemType Directory > $null
    }    
  }
  if (-not (Test-Path $Name)) {
    New-Item -Path $Name -ItemType File >$null
  }
  else {
  (Get-Item -Path $Name).LastWriteTime = Get-Date
  }
}

usage:

# will make the folder if it doesn't exist
touch filepath\file.extension
# will throw exception if the folder doesn't exist
touch filepath\file.extension -Traditional
# both will make the file or update the LastWriteTime if the file already exists

Upvotes: 1

Bruno Alves
Bruno Alves

Reputation: 1

In my case, Im just create a alias do command niin myuser_profile.ps1` file.

Set-Alias touch ni

Then I can use this command to create files, for example: touch example.js anotherone.md another.tsx

Upvotes: 0

Om Sharma
Om Sharma

Reputation: 11

If you are using the Window's Power Shell, then the touch command may show an error. Use:

New-Item* filename.filetype 

or

ni* filename.filetype

For example:

New-Item name.txt or ni name.txt

Upvotes: 0

Saad Anees
Saad Anees

Reputation: 1430

How about just use this to create .txt file in PowerShell.

New-Item .txt

Check this website for more information.

Upvotes: 1

briantist
briantist

Reputation: 47792

As Etan Reisner pointed out, touch is not a command in Windows nor in PowerShell.

If you want to just create a new file quickly (it looks like you're not interested in the use case where you just update the date of an existing file), you can use these:

$null > textfile.txt
$null | sc textfile.txt

Note that the first one will default to Unicode, so your file won't be empty; it will contain 2 bytes, the Unicode BOM.

The second one uses sc (an alias for Set-Content), which defaults to the system's active ANSI code page when used on the FileSystem, which uses no BOM and therefore truly creates an empty file.

If you use an empty string ('' or "" or [String]::Empty) instead of $null you'll end up with a line break also.

Upvotes: 12

mklement0
mklement0

Reputation: 437608

To generalize Ansgar Wiechers' helpful answer, in order to support:

  • multiple files as input, passed as individual arguments (touch file1 file2, as with the Unix touch utility) rather than as an array argument (touch file1, file2), the latter being the PowerShell-idiomatic way to pass multiple values to a single parameter.

  • wildcard patterns as input (only meaningful when targeting existing files, to update their last-write timestamps).

  • -Verbose to get feedback on what actions are performed.

Note:

  • The function only emulates the core functionality of the Unix touch utility:

    • for existing files, it sets the last-write and last-access timestamps to the current point in time,
    • whereas non-existing files are created, with no content.
  • For a more complete emulation that is also more PowerShell-idiomatic, Touch-File, see this answer.

  • The function requires PowerShell version 4 or higher, due to use of the .ForEach() array method (though it could easily be adapted to earlier versions).

function touch {
<#
.SYNOPSIS
Emulates the Unix touch utility's core functionality.
#>
  param(
    [Parameter(Mandatory, ValueFromRemainingArguments)]
    [string[]] $Path
  )

  # For all paths of / resolving to existing files, update the last-write timestamp to now.
  if ($existingFiles = (Get-ChildItem -File $Path -ErrorAction SilentlyContinue -ErrorVariable errs)) {
    Write-Verbose "Updating last-write and last-access timestamps to now: $existingFiles"
    $now = Get-Date
    $existingFiles.ForEach('LastWriteTime', $now)
    $existingFiles.ForEach('LastAccessTime', $now)
  }

  # For all non-existing paths, create empty files.
  if ($nonExistingPaths = $errs.TargetObject) {
    Write-Verbose "Creatng empty file(s): $nonExistingPaths"
    $null = New-Item $nonExistingPaths
  }

}

Upvotes: 2

GorvGoyl
GorvGoyl

Reputation: 49220

Here's the touch method with better error handling:

function touch
{
    $file = $args[0]
    if($file -eq $null) {
        throw "No filename supplied"
    }

    if(Test-Path $file)
    {
        throw "file already exists"
    }
    else
    {
        # echo $null > $file
        New-Item -ItemType File -Name ($file)
    }
}

Add this function to C:\Program Files\PowerShell\7\Microsoft.PowerShell_profile.ps1 (create this file if doesn't exist).

Use it like this: touch hey.js

Upvotes: 6

Adarsh
Adarsh

Reputation: 71

if you are using node, just use this command and it will install touch.

npm install touch-cli -g

Upvotes: 7

M2395
M2395

Reputation: 366

For single file creation in power shell : ni textfile.txt

For multiple files creation at a same time: touch a.txt,b.html,x.js is the linux command
ni a.txt,b.html,x.js is the windows power shell command

Upvotes: 31

Gerard
Gerard

Reputation: 2320

cd into the your path where you want the file to be created and then type...

New-item -itemtype file yourfilenamehere.filetype

example

New-item -itemtype file index.js

Upvotes: 2

Paul Sweatte
Paul Sweatte

Reputation: 24617

The combination of New-Item with the Name, ItemType, and Path parameters worked for me. In my case, to create a _netrc file for git:

 New-Item -Name _netrc -ItemType File -Path $env:userprofile

References

Upvotes: 1

Ryan Chase
Ryan Chase

Reputation: 2464

If you're using Windows Powershell, the equivalent command to Mac/Unix's touch is: New-Item textfile.txt -type file.

Upvotes: 29

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200273

If you need a command touch in PowerShell you could define a function that does The Right Thing™:

function touch {
  Param(
    [Parameter(Mandatory=$true)]
    [string]$Path
  )

  if (Test-Path -LiteralPath $Path) {
    (Get-Item -Path $Path).LastWriteTime = Get-Date
  } else {
    New-Item -Type File -Path $Path
  }
}

Put the function in your profile so that it's available whenever you launch PowerShell.

Defining touch as an alias (New-Alias -Name touch -Value New-Item) won't work here, because New-Item has a mandatory parameter -Type and you can't include parameters in PowerShell alias definitions.

Upvotes: 34

Related Questions