Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How do I create a temporary path within a PowerShell script?

Given the code below, how do I set a variable that I can use to call the 7z executable? The env:Path approach at the top works once but then the terminal must be reloaded or the command cannot be found. Powershell seems to be treating it as a string, not as an executable call. Ultimately, I need to be able to pull this value in from the environment.

# $env:Path += "C:\Program Files\7-Zip"
# works once, then the terminal must be reloaded

$7zip = "C:\Program Files\7-Zip\7z.exe"
$dirAsStr = "C:\Program Files\7-Zip\7z.exe"
$dirAsDir = Get-Item $dirAsStr

$extract_files = "somewhere"
$output = "someplace"

# $dirAsDir a -t7z $output\format_files.7z $extract_files\format.*
# ParserError: Unexpected token 'a' in expression or statement.
# $7zip a -t7z $output\format_files.7z $extract_files\format.*
# ParserError: Unexpected token 'a' in expression or statement.

C:\"Program Files"\7-Zip\7z.exe a -t7z $output\format_files.7z $extract_files\format.*
# works fine

>Solution :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

$env:Path += "C:\Program Files\7-Zip"

should be $env:Path += ";C:\Program Files\7-Zip" (note the ;) and it is effective for the remainder of the current session (process) only.

That is, you can then invoke 7-Zip as 7z ... in the same session.

If you want this modification to persist, i.e. to be available in all future sessions:

  • Either: Place the command in your $PROFILE file.

  • Or: Modify the persistent definition of the Path environment variable in the registry, e.g. interactively via sysdm.cpl

    • Note: Robustly updating Path programmatically is nontrivial, unfortunately – see this answer.

$7zip a -t7z...

In order to execute commands whose names or paths are stored in variables, you must invoke them via &, the call operator (which is a syntactic necessity in PowerShell):

& $7zip a -t7z ...

The same goes for command names or paths that are quoted as a whole:

  • C:\"Program Files"\7-Zip\7z.exe happens to work without &, because the argument starts with an unquoted string.

  • By contrast, "C:\Program Files"\7-Zip\7z.exe" would require &

By contrast, use of & is optional with verbatim, unquoted command names and paths (e.g, 7z, C:\tools\7z.exe)

See this answer for details.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading