Change desktop app icons on mac, programatically. 2019 - node.js

Is there a way to change icons on desktop apps for macbooks, that replicates the same action that happens when you copy / paste icons in the finder window? Either through the terminal, node.js or anything ? I have so far tried:
1) Through the terminal, deleting and replacing the icons themselves, I don't like this because it removes the original icon completely and does not work on every app.
2) Through node.js and terminal, creating an icon? file, however this did not work on every program either, and I had trouble with permission access. If anyone have a solution for this I'd like to hear it.
3) With applescript, this worked but looping through multiple icons at once was too much for it.
I've been searching about this for days, but the information is either very limited or outdated. I would appreciate any help!

To change the icon of an application, I use shell script with applescript.
The goal is to change "Icon file" in the application info.plist and copy the icon (file) in the resources of the application. "application".app/Contents/Resources/ " .
All done in a droplet, on which I drag the desired icon, after opens a window to choose the application whose icon must be changed.
With plutil I convert the file info.plist to xml1 (which I save under ".app/ Contents/infoo.plist" to avoid any problem and find the original). To change the value "Icon file", I use "/usr/libexec/PlistBuddy " with " -c Set: "
to see the change, you have to launch the application (whose icon has been changed), in the dock you have to see the new icon (if the dock option is active)
Below the droplet script
global testdir
on open draggedItems
repeat with currentItem in draggedItems
set icon_image_file_string to POSIX path of (draggedItems)
set {name:Nm, name extension:Ex} to info for POSIX file icon_image_file_string
set Nm to do shell script "echo " & Nm & " | sed 's#." & Ex & "##'"
set testdir to POSIX path of (choose file of type {"APPL"} with prompt "Choisissez l'Application pour changer son icone :")
set {name:Nmm, name extension:Ex} to info for POSIX file testdir
do shell script "plutil -convert xml1 " & quoted form of (testdir & "Contents/Info.plist ") & " | cat " & quoted form of (testdir & "Contents/Info.plist") & " >" & quoted form of (testdir & "Contents/Infoo.plist")
try
do shell script "cp -f " & quoted form of icon_image_file_string & " " & quoted form of (testdir & "Contents/Resources/")
end try
try
set icon_image_file to do shell script "/usr/libexec/PlistBuddy " & quoted form of (testdir & "Contents/Info.plist") & " -c \"Set:CFBundleIconFile " & Nm & "\""
end try
end repeat
end open

Related

Applescript if no file is added

I have the following automator apple script that I'm using so that when I drag a file into a dock icon, it opens that file in vim:
on run {input, parameters}
set filename to POSIX path of input
set cmd to "clear && 'vim' '" & filename & "' && exit"
tell application "iTerm"
set newWindow to (create window with default profile)
tell current session of newWindow
write text cmd
end tell
end tell
end run
However, I would also like to allow clicking the icon itself to open vim without any file, i.e., running $ vim. How would I change the above script so that:
If a filename is passed, I open vim with that file, vim filename
If no filename is passed (the icon is just double-clicked), it just opens vim, with vim ?
The following example AppleScript code will do as you've asked; however, keep in mind that input is a list and as presently coded it is expecting a single item list, meaning you've only dragged and dropped one file onto the app's Dock Tile:
on run {input, parameters}
if not input is equal to {} then
set filename to POSIX path of first item of input
set cmd to "clear && 'vim' '" & filename & "' && exit"
else
set cmd to "clear && 'vim' '" & "' && exit"
end if
tell application "iTerm"
set newWindow to (create window with default profile)
tell current session of newWindow
write text cmd
end tell
end tell
end run
Note: The example AppleScript code is just that and does not contain any error handling as may be appropriate. The onus is upon the user to add any error handling as may be appropriate, needed or wanted. Have a look at the try statement and error statement in the AppleScript Language Guide. See also, Working with Errors. Additionally, the use of the delay command may be necessary between events where appropriate, e.g. delay 0.5, with the value of the delay set appropriately.

Error on zipping folders in applescript

I'm trying to develop an automated script to zip up folders but I keep getting the following error:
error "Finder got an error:
zip error: Nothing to do! (/Users/dam/Desktop/Design/_TEST/basefolder/Fonts.zip)" number 12
Been scouring the forums and not quite hitting the mark. Any help for a noob would be appreciated. Thanks!
tell application "Finder"
set projFonts to (choose folder with prompt "Please select font folder.")
set fontPath to quoted form of POSIX path of projFonts
set zipName to the name of projFonts
set theFolder to POSIX path of (container of projFonts as alias)
set zipFile to the quoted form of (theFolder & zipName)
do shell script "zip -j " & zipFile & " " & fontPath
end tell
I think this is what you want, although the question lacks details.
set theItem to (choose folder)
tell application "Finder" to set {fileName, theFolder} to {theItem's name, (theItem's container as text)'s POSIX path}
do shell script "zip -rj " & (theFolder & fileName & ".zip")'s quoted form & space & theItem's POSIX path's quoted form

Query Parameters in Express being extracted?

I'm writing an API in Node.JS for an AppleScript application. The AppleScript application runs curl in a shell script in this form:
do shell script ("cd " & quoted form of myDir & "
curl http://localhost:5000/server.properties?some-value=true&next-value=something%20else&[...] -O")
It's intended to download a file called server.properties into the directory myDir with content based on the specified parameters, but for some reason when Express receives the request, it displays only this when I run console.log(res.originalUrl):
/server.properties?some-value=true
And it treats the request as if none of the other parameters are specified. Can anyone tell me what I'm doing wrong, or how to figure out where it's going wrong?
EDIT It turns out to be the way I ran the shell script. The URL needs to be quoted so that the & doesn't act as an operator in the shell script.
My solution was the following:
do shell script ("cd " & quoted form of myDir & "
curl " & quoted form of (myUrl & myQuery) & " -O")
Where myUrl is set to "http://localhost:5000/server.properties" and myQuery is set to "?some-value=true&next-value=something%20else&[...]".

How do I write to a text file using AppleScript?

So, that's it. How can I write to a text file using AppleScript?
I've tried googling around, but answers seem to be years old and I'm not really sure what should be the preferred idiom this days.
on write_to_file(this_data, target_file, append_data) -- (string, file path as string, boolean)
try
set the target_file to the target_file as text
set the open_target_file to ¬
open for access file target_file with write permission
if append_data is false then ¬
set eof of the open_target_file to 0
write this_data to the open_target_file starting at eof
close access the open_target_file
return true
on error
try
close access file target_file
end try
return false
end try
end write_to_file
Interfacing with it can be cleaned up with the following...
my WriteLog("Once upon a time in Silicon Valley...")
on WriteLog(the_text)
set this_story to the_text
set this_file to (((path to desktop folder) as text) & "MY STORY")
my write_to_file(this_story, this_file, true)
end WriteLog
A short version in pure AppleScript:
set myFile to open for access (choose file name) with write permission
write "hello world" to myFile
close access myFile
It seems there is no native one command solution. Instead you have to open and later close the file.
#JuanANavarro.
When using the shell you should use quoted form of for the TEXT and the file path.
This will help stop errors with spaces in file names and characters like apostrophes in the text for example.
set someText to "I've also learned that a quick hack, if one only wants to spit a bit of text to a file, is to use the shell."
set textFile to "/Users/USERNAME/Desktop/foo.txt"
do shell script "echo " & quoted form of someText & " > " & quoted form of textFile
The above script works fine.
If I did not have & quoted form of someText
but instead I had & someText I would get the following error.
error "sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file" number 2
The apostrophes in "I've" is seen as part of the command.
If I had
set textFile to "/Users/USERNAME/Desktop/some foo.txt" as my file path ( note the space.) And did not have & quoted form of textFile but instead I had & textFile
Then when the file was written out it would write to a file named "some" and not "some foo.txt"
I've also learned that a quick hack, if one only wants to spit a bit of text to a file, is to use the shell.
do shell script "echo TEXT > some_file.txt"
For me running do shell script was too slow on a PowerBook G4 when executed in a loop 300000 times ;), but of course that's quicker to write which sometimes makes sense. You would also want to escape shell characters like this:
do shell script "echo " & quoted form of foobar & " >> some_file.txt"
and for aesthetic reasons I would use
tell me to do shell script "#..."
but I haven't verified yet (what I believe) that if "do shell script" is in a block of "tell Finder" for example it is Finder process that creates a subshell. With "tell me to do shell script" at least Script Editor log looks better for me. ;)

use winrar command line to create zip archives

I'm using the following winrar command line to create zip archives:
rar.exe a -df -ep -ag[yyyyMMddhhmmss] -ms[txt] C:\MyZipFile.zip C:\tmp\MyFiles*.txt
The archives created are in RAR format instead of ZIP. Is there a way to create regular ZIP and not RAR archives?
Make certain you are using WinRAR.exe and not Rar.exe.
If you are using the command line to do this make sure you type:
winrar a -afzip c:\test.zip c:\test.csv
not:
a -afzip c:\test.zip c:\test.csv
It works for me. I also got it to work in SSIS.
WinRAR has a detailed description of its command line syntax in its help files (WinRAR Help), chapter "Command line syntax".
All the commands such as "a" (add to an archive), "d" (delete from an archive), "e" (extract from an archive ignoring paths) and switches such as "-af" (specify whether to create a rar or a zip file), "-ad" (append archive name to destination path) or "-p" (encrypt the archive using password protection) are listed there.
There are quite a lot of options. I recommend reading the command line syntax rules when working with WinRAR via command lines.
In order to trigger WinRAR zip-packaging from within a MS Access database application, I use in the VBA code for example
Shell c:\Programme\WinRAR\winrar.exe a -afzip -p <AnyPasswordYouLike> "e:\MyStuff\TargetFolder\Output.zip" "e:\MyStuff\SourceFolder\Input.docx"
Of course, the file paths and names are ususally entered via variables, e.g. like
Dim strWinrarCommandline As String
'... and the other variables as well declared in advance, of course...
strWinrarCommandline = strWinrarPathAndSwitches & "-p" & strPassword & " " & Chr(34) & strOutputFullName & Chr(34) & " " & Chr(34) & strInputFullName & Chr(34)
'And then call Winrar simply by:
Shell strWinrarCommandline
So rar.exe is currently unable to create zip files by itself only by calling in the Windows version it is possible.

Resources