Reputation: 4791
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
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
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
Reputation: 1
In my case, Im just create a alias do command
niin my
user_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
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
Reputation: 1430
How about just use this to create .txt file in PowerShell.
New-Item .txt
Check this website for more information.
Upvotes: 1
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
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 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
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
Reputation: 71
if you are using node, just use this command and it will install touch.
npm install touch-cli -g
Upvotes: 7
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
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
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
Permanently authenticating with Git repositories - Atlassian Documentation
Powershell - Windows Environment variables - PowerShell - SS64.com
Upvotes: 1
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
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