diff --git a/lib/core.ps1 b/lib/core.ps1 index 1640d1a433..555e9aa20b 100644 --- a/lib/core.ps1 +++ b/lib/core.ps1 @@ -269,6 +269,15 @@ powershell -noprofile -ex unrestricted `"& '$resolved_path' %args%;exit `$lastex } } +function search_in_path($target) { + $path = (env 'PATH' $false) + ";" + (env 'PATH' $true) + foreach($dir in $path.split(';')) { + if(test-path "$dir\$target" -pathType leaf) { + return "$dir\$target" + } + } +} + function ensure_in_path($dir, $global) { $path = env 'PATH' $global $dir = fullpath $dir diff --git a/lib/install.ps1 b/lib/install.ps1 index acdc936d27..45a08df8f4 100644 --- a/lib/install.ps1 +++ b/lib/install.ps1 @@ -679,14 +679,16 @@ function create_shims($manifest, $dir, $global, $arch) { $target, $name, $arg = shim_def $_ write-output "Creating shim for '$name'." - # check valid bin - $bin = "$dir\$target" - if(!(is_in_dir $dir $bin)) { - abort "Error in manifest: bin '$target' is outside the app directory." + if(test-path "$dir\$target" -pathType leaf) { + $bin = "$dir\$target" + } elseif(test-path $target -pathType leaf) { + $bin = $target + } else { + $bin = search_in_path $target } - if(!(test-path $bin)) { abort "Can't shim '$target': File doesn't exist."} + if(!$bin) { abort "Can't shim '$target': File doesn't exist."} - shim "$dir\$target" $global $name (substitute $arg @{ '$dir' = $dir; '$original_dir' = $original_dir; '$persist_dir' = $persist_dir}) + shim $bin $global $name (substitute $arg @{ '$dir' = $dir; '$original_dir' = $original_dir; '$persist_dir' = $persist_dir}) } }