On a windows machine I get this error
'touch' is not recognized as an internal or external command, operable program or batch file.
when I follow the instructions to do:
touch index.html app.js style.css
Is there a windows equivalent of using 'touch'? Do I need to create these files by hand (and modify them to change the timestamp) in order to implement this sort of command? That doesn't seem very ... node-ish...
This question is related to
cmd
I use cmder
(a command line emulator)
It allows you to run all Linux commands inside a Windows machine.
It can be downloaded from https://cmder.net/
I really like it
I'm surprised how many answers here are just wrong. Echoing nothing into a file will fill the file with something like ECHO is ON
, and trying to echo $nul
into a file will literally place $nul
into the file. Additionally for PowerShell, echoing $null
into a file won't actually make a 0kb file, but something encoded as UCS-2 LE BOM
, which can get messy if you need to make sure your files don't have a byte-order mark.
After testing all the answers here and referencing some similar ones, I can guarantee these will work per console shell. Just change FileName.FileExtension
to the full or relative-path of the file you want to touch
; thanks to Keith Russell for the COPY NUL FILE.EXT
update:
copy NUL FileName.FileExtension
This will create a new file named whatever you placed instead of FileName.FileExtension
with a size of 0 bytes. If the file already exists it will basically copy itself in-place to update the timestamp. I'd say this is more of a workaround than 1:1 functionality with touch
but I don't know of any built-in tools for CMD that can accomplish updating a file's timestamp without changing any of its other content.
if not exist FileName.FileExtension copy NUL FileName.FileExtension
if (!(Test-Path FileName.FileExtension -PathType Leaf)) {New-Item FileName.FileExtension -Type file} else {(ls FileName.FileExtension ).LastWriteTime = Get-Date}
Yes, it will work in-console as a one-liner; no requirement to place it in a PowerShell script file.
if (!(Test-Path FileName.FileExtension -PathType Leaf)) {New-Item FileName.FileExtension -Type file}
The answer is wrong, it only works when the file does not exist. If the file exists, using the first does nothing, the second adds a line at the end of the file.
The correct answer is:
copy /b filename.ext +,,
I found it here: https://superuser.com/questions/10426/windows-equivalent-of-the-linux-command-touch/764721#764721
You can replicate the functionality of touch with the following command:
$>>filename
What this does is attempts to execute a program called $
, but if $
does not exist (or is not an executable that produces output) then no output is produced by it. It is essentially a hack on the functionality, however you will get the following error message:
'$' is not recognized as an internal or external command, operable program or batch file.
If you don't want the error message then you can do one of two things:
type nul >> filename
Or:
$>>filename 2>nul
The type
command tries to display the contents of nul, which does nothing but returns an EOF (end of file) when read.
2>nul
sends error-output (output 2) to nul (which ignores all input when written to). Obviously the second command (with 2>nul
) is made redundant by the type
command since it is quicker to type. But at least you now have the option and the knowledge.
If you have Cygwin installed in your PC, you can simply use the supplied executable for touch (also via windows command prompt):
C:\cygwin64\bin\touch.exe <file_path>
Windows does not natively include a touch
command.
You can use any of the available public versions or you can use your own version. Save this code as touch.cmd
and place it somewhere in your path
@echo off
setlocal enableextensions disabledelayedexpansion
(for %%a in (%*) do if exist "%%~a" (
pushd "%%~dpa" && ( copy /b "%%~nxa"+,, & popd )
) else (
type nul > "%%~fa"
)) >nul 2>&1
It will iterate over it argument list, and for each element if it exists, update the file timestamp, else, create it.
You can use this command: ECHO >> filename.txt
it will create a file with the given extension in the current folder.
UPDATE:
for an empty file use: copy NUL filename.txt
For a very simple version of touch
which would be mostly used to create a 0 byte file in the current directory, an alternative would be creating a touch.bat
file and either adding it to the %Path%
or copying it to the C:\Windows\System32
directory, like so:
touch.bat
@echo off
powershell New-Item %* -ItemType file
Creating a single file
C:\Users\YourName\Desktop>touch a.txt Directory: C:\Users\YourName\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2020-10-14 10:28 PM 0 a.txt
Creating multiple files
C:\Users\YourName\Desktop>touch "b.txt,c.txt" Directory: C:\Users\YourName\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2020-10-14 10:52 PM 0 b.txt -a---- 2020-10-14 10:52 PM 0 c.txt
Also
New-Item : The file 'C:\Users\YourName\Desktop\a.txt' already exists.
C:\Users\YourName\Desktop>touch d.txt,e.txt,f.txt C:\Users\YourName\Desktop>touch "g.txt, 'name with spaces.txt'"
Use the following command on the your command line:
fsutil file createnew filename requiredSize
The parameters info as followed:
fsutil - File system utility ( the executable you are running )
file - triggers a file action
createnew - the action to perform (create a new file)
filename - would be literally the name of the file
requiredSize - would allocate a file size in bytes in the created file
As Raghuveer points out in his/her answer, ni
is the PowerShell alias for New-Item
, so you can create files from a PowerShell prompt using ni
instead of touch.
If you prefer to type touch
instead of ni
, you can set a touch
alias to the PowerShell New-Item
cmdlet.
Creating a touch command in Windows PowerShell:
From a PowerShell prompt, define the new alias.
Set-Alias -Name touch -Value New-Item
Now the touch command works almost the same as you are expecting. The only difference is that you'll need to separate your list of files with commas.
touch index.html, app.js, style.css
Note that this only sets the alias for PowerShell. If PowerShell isn't your thing, you can set up WSL or use bash for Windows.
Unfortunately the alias will be forgotten as soon as you end your PowerShell session. To make the alias permanent, you have to add it to your PowerShell user profile.
From a PowerShell prompt:
notepad $profile
Add your alias definition to your profile and save.
On windows Power Shell, you can use the following command:
New-Item <filename.extension>
or
New-Item <filename.extension> -type file
Note: New-Item can be replaced with its alias ni
From the Terminal of Visual Code Studio on Windows 10, this is what worked for me to create a new file:
type > hello.js
echo > orange.js
ni > peach.js
instal npm in you machine
run the below command in you command prompt.
npm install touch-cli -g
now you will be able to use touch cmd.
Easy, example with txt file
echo $null >> filename.txt
You can also use copy con [filename] in a Windows command window (cmd.exe):
C:\copy con yourfile.txt [enter]
C:\CTRL + Z [enter] //hold CTRL key & press "Z" then press Enter key.
^Z
1 Files Copied.
This will create a file named yourfile.txt
in the local directory.
No command – neither type
nor echo
– is necessary to emulate Unix's/Mac OS X's 'touch' command in a Windows Powershell terminal. Simply use the following shorthand:
$null > filename
This will create an empty file named 'filename' at your current location. Use any filename extension that you might need, e.g. '.txt'.
Source: https://superuser.com/questions/502374/equivalent-of-linux-touch-to-create-an-empty-file-with-powershell (see comments)
Assuming the file exists and you just need to update the timestamp.
type test.c > test.c.bkp && type test.c.bkp > test.c && del test.c.bkp
in cmd window type:
type nul > your_file.txt
This will create 0 bytes in your_file.txt file.
Another way of doing it is by using the echo command:
echo.> your_file.txt
echo. - will create a file with one empty line in it.
Edited on 2019-04-01:
If you need to preserve the content of the file use >>
instead of >
> Creates a new file
>> Preserves content of the file
Example
type nul >> your_file.txt
Edited on 2020-04-07
You can also use call command.
Calls one batch program from another without stopping the parent batch program. The call command accepts labels as the target of the call.
Example:
call >> your_file.txt
as mentioned
echo >> index.html
it can be any file, with any extension then do
notepad index.html
this will open your file in the notepad editor
Source: Stackoverflow.com