| ~~ |
| ~~ Licensed to the Apache Software Foundation (ASF) under one or more |
| ~~ contributor license agreements. See the NOTICE file distributed with |
| ~~ this work for additional information regarding copyright ownership. |
| ~~ The ASF licenses this file to You under the Apache License, Version 2.0 |
| ~~ (the "License"); you may not use this file except in compliance with |
| ~~ the License. You may obtain a copy of the License at |
| ~~ |
| ~~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~~ |
| ~~ Unless required by applicable law or agreed to in writing, software |
| ~~ distributed under the License is distributed on an "AS IS" BASIS, |
| ~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ~~ See the License for the specific language governing permissions and |
| ~~ limitations under the License. |
| ~~ |
| ~~ |
| |
| -------- |
| Apache Commons Exec - Building the command line |
| -------- |
| -------- |
| 20 August 2010 |
| -------- |
| |
| Building the command line |
| |
| You have two ways to create the command line to be executed |
| |
| * parsing the entire command line string |
| |
| * building the command line incrementally |
| |
| * General Considerations |
| |
| No matter which approach you are using commons-exec does change your command |
| line arguments in the following two cases |
| |
| * when the executable contains forward or backward slashes |
| |
| * when a command line argument contains an unquoted string |
| |
| The following executable arguments |
| |
| ---------------------------------------- |
| ./bin/vim |
| ---------------------------------------- |
| |
| will be translated under Windows to |
| |
| ---------------------------------------- |
| .\\bin\\vim |
| ---------------------------------------- |
| |
| * Parsing the entire command line string |
| |
| Parsing the command line string is easy to use but you might run into |
| problems when tackling complex scenarios. Therefore this functionality |
| was deprecated in the {{{http://ant.apache.org/manual/Tasks/exec.html}Ant Exec task}}. |
| |
| Let's have a look at few examples you would like to stick to parsing entire command |
| line strings |
| |
| ** Spaces in command line arguments |
| |
| Here we would like to invoke a batch file which contains spaces in the path |
| |
| ---------------------------------------- |
| cmd.exe /C c:\was51\Web Sphere\AppServer\bin\versionInfo.bat |
| ---------------------------------------- |
| |
| Due to the space in the file name we have to quote the file name either with |
| single or double quotes otherwise it falls apart into two command line |
| arguments <c:\was51\Web> and <Sphere\AppServer\bin\versionInfo.bat>. |
| |
| ---------------------------------------- |
| String line = "cmd.exe /C 'c:\\was51\\Web Sphere\\AppServer\\bin\\versionInfo.bat'"; |
| ---------------------------------------- |
| |
| * Building the Command Line Incrementally |
| |
| This is the recommended approach and caters also for pre-quoted command |
| line argument. |
| |
| ** A simple example |
| |
| Now we would like to build the following command line |
| |
| ---------------------------------------- |
| runMemorySud.cmd 10 30 -XX:+UseParallelGC -XX:ParallelGCThreads=2 |
| ---------------------------------------- |
| |
| using the following code snippet |
| |
| ---------------------------------------- |
| CommandLine cmdl = new CommandLine("runMemorySud.cmd"); |
| cmdl.addArgument("10"); |
| cmdl.addArgument("30"); |
| cmdl.addArgument("-XX:+UseParallelGC"); |
| cmdl.addArgument("-XX:ParallelGCThreads=2"); |
| ---------------------------------------- |
| |
| ** A complex example |
| |
| Now let's have a look at the following command line found somewhere in the |
| internet |
| |
| ---------------------------------------- |
| dotnetfx.exe /q:a /c:"install.exe /l ""\Documents and Settings\myusername\Local Settings\Temp\netfx.log"" /q" |
| ---------------------------------------- |
| |
| The following code snippet builds the command line using pre-quoted |
| arguments and variable expansion |
| |
| ---------------------------------------- |
| File file = new File("/Documents and Settings/myusername/Local Settings/Temp/netfx.log"); |
| Map map = new HashMap(); |
| map.put("FILE", file); |
| |
| cmdl = new CommandLine("dotnetfx.exe"); |
| cmdl.setSubstitutionMap(map); |
| cmdl.addArgument("/q:a", false); |
| cmdl.addArgument("/c:\"install.exe /l \"\"${FILE}\"\" /q\"", false); |
| ---------------------------------------- |
| |
| * For the Desperate |
| |
| When crafting a command line it would be really helpful to see what |
| happens to your command line arguments. The following scripts can be |
| invoked to print your command line arguments for Unix |
| |
| ---------------------------------------- |
| while [ $# -gt 0 ] |
| do |
| echo "$1" |
| shift |
| done |
| ---------------------------------------- |
| |
| and for Windows |
| |
| ---------------------------------------- |
| :Loop |
| IF [%1]==[] GOTO Continue |
| @ECHO "%1" |
| SHIFT |
| GOTO Loop |
| :Continue |
| ---------------------------------------- |
| |