Hi
trying to write a script to automate the creation of MacOS installer.
Plz suggest how I can
A. “do shell script” opens a terminal window to display the progress of the process
B. Get path to removable disk whose name is “No Name” (Selected from disc names)
Thank you
Below is script which works but no progress indicator
tell application "System Events" to set diskList to (get the name of every disk where it is ejectable)
set theDisk to choose from list diskList with prompt "Select which Disc to Install:"
set diskPath to "/Volumes/" & theDisk
-- Select MacOS Installer
set theMacOS to POSIX path of (choose file with prompt "Please MacOS Installer:" default location (path to "apps")) as text
-- User name & password
set userName to short user name of (system info)
display dialog "Installer will need an Admin User name and password in order to make your changes." & return & return & "Please enter an admin password." default answer "" with icon 2 with hidden answer
set pword to text returned of result
-- Command
set thePath to quoted form of theMacOS & ("Contents/Resources/createinstallmedia --volume ") & quoted form of diskPath & (" --nointeraction")
-- Run the Script
do shell script thePath user name userName password pword with administrator privileges
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
-- Select Removable Disk to Instal upon
tell application "System Events" to set diskList to (get the name of every disk where it is ejectable)
set theDisk to choose from list diskList with prompt "Select which Disc to Install:"
set diskPath to "/Volumes/" & theDisk
-- Select MacOS Installer
set theMacOS to POSIX path of (choose file with prompt "Please MacOS Installer:" default location (path to "apps")) as text
-- Run in Terminal window
inTerminal(diskPath, theMacOS)
-- Run in Script Edito (No progress Bar)
--inEditor(diskPath, theMacOS)
on inTerminal(diskPath, theMacOS)
-- Escape white space of paths
set theMacOS to findAndReplaceInText(theMacOS, " ", "\\ ") of me
set diskPath to findAndReplaceInText(diskPath, " ", "\\ ") of me -- escape white space
-- Create Command
set thePath to "sudo " & theMacOS & "Contents/Resources/createinstallmedia --volume " & diskPath & " --nointeraction"
-- Run command in Terminal
doComInTerminalWindow(thePath) of me
end inTerminal
on inEditor(diskPath, theMacOS)
-- Gather Info to run command with Admn privileges aka Sudo
-- User Name
set userName to short user name of (system info)
- For Password
display dialog "Installer will need an Admin User name and password in order to make your changes." & return & return & "Please enter an admin password." default answer "" with icon 2 with hidden answer
set pword to text returned of result
-- Create Command
set thePath to quoted form of theMacOS & ("Contents/Resources/createinstallmedia --volume ") & quoted form of diskPath & (" --nointeraction")
-- Run the Script
do shell script thePath user name userName password pword with administrator privileges
end inEditor
--================================================================
--» HANDLER
--================================================================
on doComInTerminalWindow(aCMD as string)
using terms from application "Terminal"
tell application id "com.apple.Terminal"
activate
set wCount to count (every window whose visible is true)
if wCount = 0 then
-- If no terminal window visible
do script aCMD
else
-- Terminal window Visible
do script aCMD in front window
end if
end tell
end using terms from
end doComInTerminalWindow
on findAndReplaceInText(theText, theSearchString, theReplacementString)
set AppleScript's text item delimiters to theSearchString
set theTextItems to every text item of theText
set AppleScript's text item delimiters to theReplacementString
set theText to theTextItems as string
set AppleScript's text item delimiters to ""
return theText
end findAndReplaceInText
--» End of Handler ===================================================
I modified your script to have the output from the ‘createinstallmedia’ command go to a temp text file and also run in the background. So the script can monitor the text file for progress.
I have one glaring problem.
When you use ‘createinstallmedia’ in a terminal without ‘–nointeraction’ it pauses waiting for user input, but it output the correct text below:
With ‘–nointeraction’ it doesn’t pause for user input (which we want), but it only outputs this:
Here is the script:
use AppleScript version "2.4" -- Yosemite (10.10) or later
use scripting additions
tell application "System Events" to set diskList to (get the name of every disk whose ejectable is true)
set theDisk to choose from list diskList with prompt "Select which Disc to Install:"
set theDisk to "Untitled" -- TESTING
set diskPath to "/Volumes/" & theDisk
-- Select MacOS Installer
set theMacOS to POSIX path of (choose file with prompt "Please Choose MacOS Installer:" default location (path to "apps")) as text
-- User name & password
set userName to short user name of (system info)
set pword to text returned of (display dialog "Installer will need an Admin User name and password in order to make your changes." & return & return & "Please enter an admin password." default answer "" with icon 2 with hidden answer)
-- Command
set thePath to quoted form of theMacOS & ("Contents/Resources/createinstallmedia --volume ") & quoted form of diskPath & (" --nointeraction >/Users/Shared/cim.txt 2>&1 &")
-- Run the Script
get thePath
set thePID to do shell script thePath user name userName password pword with administrator privileges
set progress description to "Creating bootable USB installer…"
set progress total steps to 10
set progress completed steps to 0
set pnum to 0
repeat
set progString to get_Progress()
if class of progString is not boolean then
try
set pnum to (last word of progString) as integer
set progress completed steps to (pnum div 10)
set progress additional description to first paragraph of progString
end try
if pnum = 100 then exit repeat
end if
delay 3
end repeat
-- delete progress log file
tell application "System Events" to delete file ((path to shared documents as text) & "cim.txt")
on get_Progress()
local cfile, progString, flag
try
set cfile to open for access ((path to shared documents as text) & "cim.txt")
on error
return false
end try
try
set progString to read cfile from 1 as text
on error
set progString to false
end try
close access cfile
if class of progString is text then
set progString to paragraphs of progString
repeat with i in progString
set i to contents of i
if "Copying to disk" is in i then
set progString to i
exit repeat
end if
end repeat
if class of progString is list then set progString to "0"
end if
return progString
end get_Progress
I figured out how to get the progress using the unix ‘lsof’ command.
use AppleScript version "2.4" -- Yosemite (10.10) or later
use scripting additions
global userName, pword, thePID
on run
local diskList, theDisk, diskPath, theMacOS, theCMD, PCT, fSize, dmg
set {PCT, dmg} to {0, ""}
tell application "System Events" to set diskList to (get the name of every disk whose ejectable is true)
set diskPath to choose from list diskList with prompt "Select which Disc to Install:"
if class of diskPath is boolean then return
set diskPath to "/Volumes/" & diskPath
-- Select MacOS Installer
set installPath to (choose file with prompt "Please Choose MacOS Installer:" default location (path to "apps")) as text
if class of installPath is boolean then return
set installPath to POSIX path of installPath
set dmg to installPath & "Contents/SharedSupport/SharedSupport.dmg"
-- User name & password
set userName to short user name of (system info)
set pword to text returned of (display dialog "Installer will need an Admin User name and password in order to make your changes." & return & return & "Please enter an admin password." default answer "" with icon 2 with hidden answer)
-- Command
set theCMD to quoted form of installPath & ("Contents/Resources/createinstallmedia --volume ") & quoted form of diskPath & (" --nointeraction >/dev/null 2>&1 & echo $!")
set fSize to size of (info for POSIX file dmg)
-- Run the Script
set thePID to do shell script theCMD user name userName password pword with administrator privileges
set progress description to "Creating bootable USB installer…"
set progress total steps to 100
set progress completed steps to 0
set tid to text item delimiters
repeat
--do shell script ("ps -ax -o pid= " & thePID)
set writeNum to get_Progress()
if class of writeNum is boolean then
if PCT = 99 then
set PCT to 100
else
display alert "Error copying files!" giving up after 10
return
end if
end if
if writeNum = 0 then
if PCT = 99 then set PCT to 100
else
set PCT to writeNum / fSize * 100 div 1
end if
set progress completed steps to PCT
set progress additional description to "copying is " & PCT & "% done."
delay 5
if PCT = 100 then exit repeat
end repeat
set text item delimiters to tid
display alert "Installer creation done!" giving up after 10
end run
on get_Progress()
local lsof, flag, fLen
set text item delimiters to "/"
try
set lsof to paragraphs of (do shell script ("sudo lsof -p " & thePID) user name userName password pword with administrator privileges)
on error
return false
end try
set fLen to 0
repeat with i in lsof
set mpath to rest of (text items of i)
if (count mpath) > 0 then
if (item 1 of mpath) = "Volumes" then
if (last item of mpath) = "SharedSupport.dmg" then
set fLen to (word 7 of i) as integer
exit repeat
end if
end if
end if
end repeat
return fLen
end get_Progress
if you make this script a standalone app, the progress bar will be a floating window