Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 1923c0e

Browse files
committedMar 19, 2017
more for bfgroup#157: update detect vs2017+ scripts to v1.11.2
also try to speedup tests
1 parent eba5932 commit 1923c0e

9 files changed

+402
-290
lines changed
 

‎src/engine/config_toolset.bat

+7-3
Original file line numberDiff line numberDiff line change
@@ -165,21 +165,25 @@ if "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" (
165165
if NOT "_%VS150COMNTOOLS%_" == "__" (
166166
set "BOOST_JAM_TOOLSET_ROOT=%VS150COMNTOOLS%..\..\VC\"
167167
))
168-
SET cl_path_cmd="%~dp0..\tools\vc141helper\cl_path.cmd"
168+
169+
IF DEFINED EXPENSIVE_POWERSHELL2 goto :Skip_VC1410
170+
SET EXPENSIVE_POWERSHELL2=1
171+
SET vsCOMhelper_cmd="%~dp0..\tools\vsCOMhelper\get_key_helper.cmd" "IsVcCompatible,VisualCppToolsVersionMinor=14.10" "InstallationPath"
169172
if "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" (
170-
for /f "tokens=*" %%A in ('cmd /D /S /C "%cl_path_cmd% 14.10"') do if NOT errorlevel 1 if NOT "_%%A_" == "__" (
173+
for /f "tokens=*" %%A in ('cmd /D /S /C "%vsCOMhelper_cmd%"') do if NOT errorlevel 1 if NOT "_%%A_" == "__" (
171174
set "BOOST_JAM_TOOLSET_ROOT=%%A\VC\"))
172175

173176
REM vc1410 vsvarsall requires the architecture as a parameter.
174177
if "_%BOOST_JAM_ARCH%_" == "__" set BOOST_JAM_ARCH=x86
175178
set BOOST_JAM_ARGS=%BOOST_JAM_ARGS% %BOOST_JAM_ARCH%
176179

177-
if "_%VSINSTALLDIR%_" == "__" call :Call_If_Exists "%BOOST_JAM_TOOLSET_ROOT%Auxiliary\Build\vcvarsall.bat" %BOOST_JAM_ARGS%
180+
call :Call_If_Exists "%BOOST_JAM_TOOLSET_ROOT%Auxiliary\Build\vcvarsall.bat" %BOOST_JAM_ARGS%
178181
set "BOOST_JAM_CC=cl /nologo /RTC1 /Zi /MTd /Fobootstrap/ /Fdbootstrap/ -DNT -DYYDEBUG -wd4996 kernel32.lib advapi32.lib user32.lib"
179182
set "BOOST_JAM_OPT_JAM=/Febootstrap\jam0"
180183
set "BOOST_JAM_OPT_MKJAMBASE=/Febootstrap\mkjambase0"
181184
set "BOOST_JAM_OPT_YYACC=/Febootstrap\yyacc0"
182185
set "_known_=1"
186+
183187
:Skip_VC1410
184188
if NOT "_%BOOST_JAM_TOOLSET%_" == "_borland_" goto Skip_BORLAND
185189
if "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" (

‎src/engine/guess_toolset.bat

+17-4
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,24 @@ if NOT "_%VS150COMNTOOLS%_" == "__" (
3232
set "BOOST_JAM_TOOLSET=vc1410"
3333
set "BOOST_JAM_TOOLSET_ROOT=%VS150COMNTOOLS%..\..\VC\"
3434
goto :eof)
35-
SET cl_path_cmd="%~dp0..\tools\vc141helper\cl_path.cmd"
36-
for /f "tokens=*" %%A in ('cmd /D /S /C "%cl_path_cmd% 14.10"') do if NOT errorlevel 1 if NOT "_%%A_" == "__" (
37-
set "BOOST_JAM_TOOLSET=vc1410"
38-
set "BOOST_JAM_TOOLSET_ROOT=%%A\VC\"
35+
36+
IF DEFINED EXPENSIVE_POWERSHELL goto :After_vsCOMhelper
37+
SET EXPENSIVE_POWERSHELL=1
38+
SET vsCOMhelper_cmd="%~dp0..\tools\vsCOMhelper\get_key_helper.cmd" IsVcCompatible
39+
for /f "tokens=*" %%A in ('cmd /D /S /C "%vsCOMhelper_cmd% InstallationPath"') do call :vsCOMhelper_2 %%A
40+
IF NOT DEFINED BOOST_JAM_TOOLSET goto :After_vsCOMhelper
41+
IF NOT DEFINED BOOST_JAM_TOOLSET_ROOT goto :After_vsCOMhelper
42+
goto :eof
43+
44+
:vsCOMhelper_2
45+
IF "_%1_"=="__" goto :eof
46+
set "BOOST_JAM_TOOLSET_ROOT=%1\VC\"
47+
for /f "tokens=*" %%A in ('cmd /D /S /C "%vsCOMhelper_cmd% VCToolsVersionCode"') do if NOT "_%%A_"=="__" (
48+
set "BOOST_JAM_TOOLSET=%%A"
3949
goto :eof)
50+
goto :eof
51+
52+
:After_vsCOMhelper
4053
if EXIST "%VS_ProgramFiles%\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" (
4154
set "BOOST_JAM_TOOLSET=vc1410"
4255
set "BOOST_JAM_TOOLSET_ROOT=%VS_ProgramFiles%\Microsoft Visual Studio\2017\Enterprise\VC\"

‎src/tools/msvc.jam

+11-4
Original file line numberDiff line numberDiff line change
@@ -710,14 +710,19 @@ local rule auto-detect-toolset-versions ( )
710710
{
711711
if $(i) = 14.10
712712
{
713+
if $(.cl_path-vc1410-root-path)
714+
{
715+
register-configuration $(i) : $(.cl_path-vc1410-root-path) ;
716+
}
717+
713718
local file = [ path.make [ modules.binding $(__name__) ] ] ;
714-
local cl_path = [ path.native [ path.join [ path.parent $(file) ] vc141helper cl_path.cmd ] ] ;
715-
local shell_ret = [ SHELL "$(cl_path) 14.10 -PathToCompiler" ] ;
719+
local vsCOMhelper_path = [ path.native [ path.join [ path.parent $(file) ] vsCOMhelper get_key_helper.cmd ] ] ;
720+
local shell_ret = [ SHELL "\"$(vsCOMhelper_path)\" \"IsVcCompatible,VisualCppToolsVersionMinor=$(i)\" VisualCppTools" ] ;
716721
local cl_path = $(shell_ret:D) ;
717722
if $(cl_path)
718723
{
719-
path = [ path.native $(cl_path) ] ;
720-
register-configuration $(i) : $(path) ;
724+
.cl_path-vc1410-root-path = [ path.native $(cl_path) ] ;
725+
register-configuration $(i) : $(.cl_path-vc1410-root-path) ;
721726
}
722727
}
723728

@@ -1662,6 +1667,8 @@ if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ]
16621667
# corresponding environment variable.
16631668
.version-7.1toolkit-envpath = "bin" ;
16641669

1670+
#
1671+
.cl_path-vc1410-root-path = "" ;
16651672

16661673
# Auto-detect all the available msvc installations on the system.
16671674
auto-detect-toolset-versions ;

‎src/tools/vc141helper/GetCLPath.ps1

-36
This file was deleted.

‎src/tools/vc141helper/GetVS2017Configuration.cs

-234
This file was deleted.

‎src/tools/vc141helper/cl_path.cmd

-9
This file was deleted.

‎src/tools/vsCOMhelper/GetKey.ps1

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Copyright 2017 - Refael Ackermann
2+
# Distributed under MIT style license
3+
# See accompanying file LICENSE at https://github.com/node4good/windows-autoconf
4+
# version: 1.11.1
5+
6+
param (
7+
[Parameter(Mandatory=$false)]
8+
[string[]]$filters = "IsVcCompatible",
9+
[Parameter(Mandatory=$false)]
10+
[string[]]$keys = "VisualCppToolsCL"
11+
)
12+
if (-NOT (Test-Path 'Registry::HKEY_CLASSES_ROOT\CLSID\{177F0C4A-1CD3-4DE7-A32C-71DBBB9FA36D}')) { Exit 1 }
13+
Add-Type -Path GetVS2017Configuration.cs;
14+
$insts = [VisualStudioConfiguration.ComSurrogate]::QueryEx()
15+
foreach ($filter in $filters) {
16+
if ($filter -ne "*") {
17+
if ($filter -like "*=*") {
18+
$parts = $filter -Split "=";
19+
$filter = $parts[0];
20+
$criteria = $parts[1];
21+
$insts = $insts | where { $_.Get($filter) -eq $criteria }
22+
} else {
23+
$insts = $insts | where { $_.Get($filter) }
24+
}
25+
}
26+
}
27+
foreach ($key in $keys) {
28+
if ($key -eq "*") { $insts | echo } else { $insts | % { $_.Get($key) } }
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,326 @@
1+
// Copyright 2017 - Refael Ackermann
2+
// Distributed under MIT style license
3+
// See accompanying file LICENSE at https://github.com/node4good/windows-autoconf
4+
// version: 1.11.2
5+
6+
// Usage:
7+
// powershell -ExecutionPolicy Unrestricted -Command "&{ Add-Type -Path GetVS2017Configuration.cs; $insts = [VisualStudioConfiguration.ComSurrogate]::QueryEx(); $insts | ft }"
8+
namespace VisualStudioConfiguration
9+
{
10+
using System;
11+
using System.Collections.Generic;
12+
using System.Runtime.InteropServices;
13+
using System.Text.RegularExpressions;
14+
15+
[Flags]
16+
public enum InstanceState : uint
17+
{
18+
None = 0,
19+
Local = 1,
20+
Registered = 2,
21+
NoRebootRequired = 4,
22+
NoErrors = 8,
23+
Complete = 4294967295,
24+
}
25+
26+
[Guid("6380BCFF-41D3-4B2E-8B2E-BF8A6810C848")]
27+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
28+
[ComImport]
29+
public interface IEnumSetupInstances
30+
{
31+
32+
void Next([MarshalAs(UnmanagedType.U4), In] int celt,
33+
[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.Interface), Out] ISetupInstance[] rgelt,
34+
[MarshalAs(UnmanagedType.U4)] out int pceltFetched);
35+
36+
void Skip([MarshalAs(UnmanagedType.U4), In] int celt);
37+
38+
void Reset();
39+
40+
[return: MarshalAs(UnmanagedType.Interface)]
41+
IEnumSetupInstances Clone();
42+
}
43+
44+
[Guid("42843719-DB4C-46C2-8E7C-64F1816EFD5B")]
45+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
46+
[ComImport]
47+
public interface ISetupConfiguration
48+
{
49+
}
50+
51+
[Guid("26AAB78C-4A60-49D6-AF3B-3C35BC93365D")]
52+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
53+
[ComImport]
54+
public interface ISetupConfiguration2 : ISetupConfiguration
55+
{
56+
57+
[return: MarshalAs(UnmanagedType.Interface)]
58+
IEnumSetupInstances EnumInstances();
59+
60+
[return: MarshalAs(UnmanagedType.Interface)]
61+
ISetupInstance GetInstanceForCurrentProcess();
62+
63+
[return: MarshalAs(UnmanagedType.Interface)]
64+
ISetupInstance GetInstanceForPath([MarshalAs(UnmanagedType.LPWStr), In] string path);
65+
66+
[return: MarshalAs(UnmanagedType.Interface)]
67+
IEnumSetupInstances EnumAllInstances();
68+
}
69+
70+
[Guid("B41463C3-8866-43B5-BC33-2B0676F7F42E")]
71+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
72+
[ComImport]
73+
public interface ISetupInstance
74+
{
75+
}
76+
77+
[Guid("89143C9A-05AF-49B0-B717-72E218A2185C")]
78+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
79+
[ComImport]
80+
public interface ISetupInstance2 : ISetupInstance
81+
{
82+
[return: MarshalAs(UnmanagedType.BStr)]
83+
string GetInstanceId();
84+
85+
[return: MarshalAs(UnmanagedType.Struct)]
86+
System.Runtime.InteropServices.ComTypes.FILETIME GetInstallDate();
87+
88+
[return: MarshalAs(UnmanagedType.BStr)]
89+
string GetInstallationName();
90+
91+
[return: MarshalAs(UnmanagedType.BStr)]
92+
string GetInstallationPath();
93+
94+
[return: MarshalAs(UnmanagedType.BStr)]
95+
string GetInstallationVersion();
96+
97+
[return: MarshalAs(UnmanagedType.BStr)]
98+
string GetDisplayName([MarshalAs(UnmanagedType.U4), In] int lcid);
99+
100+
[return: MarshalAs(UnmanagedType.BStr)]
101+
string GetDescription([MarshalAs(UnmanagedType.U4), In] int lcid);
102+
103+
[return: MarshalAs(UnmanagedType.BStr)]
104+
string ResolvePath([MarshalAs(UnmanagedType.LPWStr), In] string pwszRelativePath);
105+
106+
[return: MarshalAs(UnmanagedType.U4)]
107+
InstanceState GetState();
108+
109+
[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UNKNOWN)]
110+
ISetupPackageReference[] GetPackages();
111+
112+
ISetupPackageReference GetProduct();
113+
114+
[return: MarshalAs(UnmanagedType.BStr)]
115+
string GetProductPath();
116+
117+
[return: MarshalAs(UnmanagedType.VariantBool)]
118+
bool IsLaunchable();
119+
120+
[return: MarshalAs(UnmanagedType.VariantBool)]
121+
bool IsComplete();
122+
123+
[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UNKNOWN)]
124+
ISetupPropertyStore GetProperties();
125+
126+
[return: MarshalAs(UnmanagedType.BStr)]
127+
string GetEnginePath();
128+
}
129+
130+
[Guid("DA8D8A16-B2B6-4487-A2F1-594CCCCD6BF5")]
131+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
132+
[ComImport]
133+
public interface ISetupPackageReference
134+
{
135+
136+
[return: MarshalAs(UnmanagedType.BStr)]
137+
string GetId();
138+
139+
[return: MarshalAs(UnmanagedType.BStr)]
140+
string GetVersion();
141+
142+
[return: MarshalAs(UnmanagedType.BStr)]
143+
string GetChip();
144+
145+
[return: MarshalAs(UnmanagedType.BStr)]
146+
string GetLanguage();
147+
148+
[return: MarshalAs(UnmanagedType.BStr)]
149+
string GetBranch();
150+
151+
[return: MarshalAs(UnmanagedType.BStr)]
152+
string GetType();
153+
154+
[return: MarshalAs(UnmanagedType.BStr)]
155+
string GetUniqueId();
156+
157+
[return: MarshalAs(UnmanagedType.VariantBool)]
158+
bool GetIsExtension();
159+
}
160+
161+
[Guid("c601c175-a3be-44bc-91f6-4568d230fc83")]
162+
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
163+
[ComImport]
164+
public interface ISetupPropertyStore
165+
{
166+
167+
[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
168+
string[] GetNames();
169+
170+
object GetValue([MarshalAs(UnmanagedType.LPWStr), In] string pwszName);
171+
}
172+
173+
[Guid("42843719-DB4C-46C2-8E7C-64F1816EFD5B")]
174+
[CoClass(typeof(SetupConfigurationClass))]
175+
[ComImport]
176+
public interface SetupConfiguration : ISetupConfiguration2, ISetupConfiguration
177+
{
178+
}
179+
180+
[Guid("177F0C4A-1CD3-4DE7-A32C-71DBBB9FA36D")]
181+
[ClassInterface(ClassInterfaceType.None)]
182+
[ComImport]
183+
public class SetupConfigurationClass
184+
{
185+
}
186+
187+
188+
public class VSInstance : Dictionary<string, object>
189+
{
190+
public object Get(string key) {
191+
if (!this.ContainsKey(key)) return false;
192+
return this[key];
193+
}
194+
195+
public bool JSONBool(string key)
196+
{
197+
if (key == null || key == "") return true;
198+
if (!this.ContainsKey(key)) return false;
199+
object val = this[key];
200+
if (val is Boolean) return (bool)val;
201+
if (val is String[]) return ((String[])val).Length != 0;
202+
string sVal = (string)val;
203+
if (sVal == null) return false;
204+
if (sVal.Length == 0) return false;
205+
if (sVal.Trim() == "{}") return false;
206+
if (sVal.Trim() == "[]") return false;
207+
if (sVal.Trim() == "0") return false;
208+
return true;
209+
}
210+
}
211+
212+
public static class ComSurrogate
213+
{
214+
public static bool Is64()
215+
{
216+
return (IntPtr.Size == 8);
217+
}
218+
219+
public static List<VSInstance> QueryEx(params string[] args)
220+
{
221+
List<VSInstance> insts = new List<VSInstance>();
222+
ISetupConfiguration query = new SetupConfiguration();
223+
ISetupConfiguration2 query2 = (ISetupConfiguration2) query;
224+
IEnumSetupInstances e = query2.EnumAllInstances();
225+
ISetupInstance2[] rgelt = new ISetupInstance2[1];
226+
int pceltFetched;
227+
e.Next(1, rgelt, out pceltFetched);
228+
while (pceltFetched > 0)
229+
{
230+
ISetupInstance2 raw = rgelt[0];
231+
insts.Add(ParseInstance(raw));
232+
e.Next(1, rgelt, out pceltFetched);
233+
}
234+
foreach (VSInstance inst in insts.ToArray())
235+
{
236+
foreach (string key in args) {
237+
if (!inst.JSONBool(key)) {
238+
insts.Remove(inst);
239+
}
240+
}
241+
if (Array.IndexOf(args, "Packages") == -1) {
242+
inst.Remove("Packages");
243+
}
244+
}
245+
return insts;
246+
}
247+
248+
private static VSInstance ParseInstance(ISetupInstance2 setupInstance2)
249+
{
250+
VSInstance inst = new VSInstance();
251+
string[] prodParts = setupInstance2.GetProduct().GetId().Split('.');
252+
Array.Reverse(prodParts);
253+
inst["Product"] = prodParts[0];
254+
inst["ID"] = setupInstance2.GetInstanceId();
255+
inst["Name"] = setupInstance2.GetDisplayName(0x1000);
256+
inst["Description"] = setupInstance2.GetDescription(0x1000);
257+
inst["InstallationName"] = setupInstance2.GetInstallationName();
258+
inst["Version"] = setupInstance2.GetInstallationVersion();
259+
inst["State"] = Enum.GetName(typeof(InstanceState), setupInstance2.GetState());
260+
inst["InstallationPath"] = setupInstance2.GetInstallationPath();
261+
inst["IsComplete"] = setupInstance2.IsComplete();
262+
inst["IsLaunchable"] = setupInstance2.IsLaunchable();
263+
inst["Common7ToolsPath"] = inst["InstallationPath"] + @"\Common7\Tools\";
264+
inst["CmdPath"] = inst["Common7ToolsPath"] + "VsDevCmd.bat";
265+
inst["VCAuxiliaryBuildPath"] = inst["InstallationPath"] + @"\VC\Auxiliary\Build\";
266+
inst["VCVarsAllPath"] = inst["VCAuxiliaryBuildPath"] + "vcvarsall.bat";
267+
268+
inst["Win8SDK"] = "";
269+
inst["SDK10Full"] = "";
270+
inst["VisualCppTools"] = "";
271+
272+
Regex trimmer = new Regex(@"\.\d+$");
273+
274+
List<string> packs = new List<String>();
275+
foreach (ISetupPackageReference package in setupInstance2.GetPackages())
276+
{
277+
string id = package.GetId();
278+
279+
string ver = package.GetVersion();
280+
string detail = "{\"id\": \"" + id + "\", \"version\":\"" + ver + "\"}";
281+
packs.Add(" " + detail);
282+
283+
if (id.Contains("Component.MSBuild")) {
284+
inst["MSBuild"] = detail;
285+
inst["MSBuildVerFull"] = ver;
286+
} else if (id.Contains("Microsoft.VisualCpp.Tools.Core")) {
287+
inst["VCTools"] = detail;
288+
inst["VisualCppToolsFullVersion"] = ver;
289+
string majorMinor = trimmer.Replace(trimmer.Replace(ver, ""), "");
290+
inst["VisualCppToolsVersionMinor"] = majorMinor;
291+
inst["VCToolsVersionCode"] = "vc" + majorMinor.Replace(".", "");
292+
} else if (id.Contains("Microsoft.Windows.81SDK")) {
293+
if (inst["Win8SDK"].ToString().CompareTo(ver) > 0) continue;
294+
inst["Win8SDK"] = ver;
295+
} else if (id.Contains("Win10SDK_10")) {
296+
if (inst["SDK10Full"].ToString().CompareTo(ver) > 0) continue;
297+
inst["SDK10Full"] = ver;
298+
}
299+
}
300+
packs.Sort();
301+
inst["Packages"] = packs.ToArray();
302+
303+
string[] sdk10Parts = inst["SDK10Full"].ToString().Split('.');
304+
sdk10Parts[sdk10Parts.Length - 1] = "0";
305+
inst["SDK10"] = String.Join(".", sdk10Parts);
306+
inst["SDK"] = inst["SDK10"].ToString() != "0" ? inst["SDK10"] : inst["Win8SDK"];
307+
if (inst.ContainsKey("MSBuildVerFull")) {
308+
string ver = trimmer.Replace(trimmer.Replace((string)inst["MSBuildVerFull"], ""), "");
309+
inst["MSBuildVer"] = ver;
310+
inst["MSBuildToolsPath"] = inst["InstallationPath"] + @"\MSBuild\" + ver + @"\Bin\";
311+
inst["MSBuildPath"] = inst["MSBuildToolsPath"] + "MSBuild.exe";
312+
}
313+
if (inst.ContainsKey("VCTools")) {
314+
string ver = trimmer.Replace((string)inst["VisualCppToolsFullVersion"], "");
315+
inst["VisualCppToolsX64"] = inst["InstallationPath"] + @"\VC\Tools\MSVC\" + ver + @"\bin\HostX64\x64\";
316+
inst["VisualCppToolsX64CL"] = inst["VisualCppToolsX64"] + "cl.exe";
317+
inst["VisualCppToolsX86"] = inst["InstallationPath"] + @"\VC\Tools\MSVC\" + ver + @"\bin\HostX86\x86\";
318+
inst["VisualCppToolsX86CL"] = inst["VisualCppToolsX86"] + "cl.exe";
319+
inst["VisualCppTools"] = Is64() ? inst["VisualCppToolsX64"] : inst["VisualCppToolsX86"];
320+
inst["VisualCppToolsCL"] = Is64() ? inst["VisualCppToolsX64CL"] : inst["VisualCppToolsX86CL"];
321+
}
322+
inst["IsVcCompatible"] = inst.JSONBool("SDK") && inst.JSONBool("MSBuild") && inst.JSONBool("VisualCppTools");
323+
return inst;
324+
}
325+
}
326+
}
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
:: Copyright 2017 - Refael Ackermann
2+
:: Distributed under MIT style license
3+
:: See accompanying file LICENSE at https://github.com/node4good/windows-autoconf
4+
:: version: 1.11.1
5+
6+
@IF NOT DEFINED DEBUG_GETTER @ECHO OFF
7+
SETLOCAL
8+
PUSHD %~dp0
9+
powershell -NoProfile -ExecutionPolicy Unrestricted ".\GetKey.ps1" -filters %1 -keys %2
10+
IF ERRORLEVEL 1 SET RET=1
11+
POPD
12+
EXIT /B %RET%

0 commit comments

Comments
 (0)
Please sign in to comment.