我有一个需要添加到安装程序的目录结构.我有3个不同版本的安装脚本,其中一个是升级脚本,需要在安装目录中排除某个文件和子目录.所以我做了以下事情:
File /r /x ${InputDir}\data\someFile.xml /x ${InputDir}\data\derbydb\runtime\*.* ${InputDir}\*.*
Run Code Online (Sandbox Code Playgroud)
xml文件和derbydb目录已经存在(因为这是一个升级),因此我不想覆盖它们.然而,在运行安装程序时,我清楚地看到两个文件都被覆盖,而且使用7zip查看生成的setup.exe也表明它们已被添加.人们可能刚刚打过电话
File /r ${InputDir}\*.*
Run Code Online (Sandbox Code Playgroud)
那么这里出了什么问题?我希望NSIS有更好的文档或列出其命令参数/语法的警告.(/咆哮)
我正在开发一个Java程序,它必须获取机器序列号,CPU序列号等.在Windows上,WMI接口是查询此类信息的最佳方式,使用命令行查询的标准方法是
wmic bios get serialnumber
Run Code Online (Sandbox Code Playgroud)
产生输出:
SerialNumber
WWV46RT609A3467173E
Run Code Online (Sandbox Code Playgroud)
将它翻译成Java,我使用了Runtime.exec()和ProcessBuilder,如下所示:(评论过程p是我之前做过的).这里,component和item对应于上面命令行中的'bios'和'serialnumber'.
String ret = "";
ProcessBuilder pb = new ProcessBuilder("wmic", component, "get", item);
pb.redirectErrorStream(true);
// Process p = Runtime.getRuntime().exec(
// "wmic " + component + " get " + item);
Process p = pb.start();
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader input = new BufferedReader(isr);
String str;
while ((str = input.readLine()) != null) {
if (str.equalsIgnoreCase(item) || StringUtils.isBlank(str)) {
continue;
}
ret = str.trim();
}
input.close();
isr.close();
System.out.println(ret);
Run Code Online (Sandbox Code Playgroud)
此代码段在Windows 7上完美运行,但在Windows XP上挂起.使用命令行中的wmic可以在两个操作系统上运行.我在这里读到处理被调用进程的stdout和stderr时出现问题,因此调用了redirectErrorStream(). …
我试图通过外部传递版本号来概括设置文件.我希望能够这样做:
makensis myscript.nsi parameter=value
Run Code Online (Sandbox Code Playgroud)
然后读取脚本中的参数,以便使用相同的脚本生成不同版本的可执行文件.我找到了这个和这个,但它们似乎是用于将命令行参数传递给生成的setup.exe.这有可能,怎么样?
我正在开发一个复杂的桌面应用程序,其中包含多个用于工作流的选项卡式窗格,每个窗格都塞满了不同的按钮、标签和其他 UI 元素。它们中的每一个都需要一个定义的助记符,而这些经常因为用完要定义的字母而发生冲突。
我注意到在 Windows 上,如果为两个控件定义了相同的助记符,则按下它会在它们之间循环,并在释放键时激活它们。使用 Swing,如果您使用相同的键定义其中的 2 个,助记符将不会激活。
有解决方法吗?
到目前为止,我已经找到了如何通过读取注册表项来检测以前的软件安装,并测试该目录是否存在.(两者都在NSIS帮助文件中有详细记录).现在我想强制用户指定一个不同的目录,如果以前安装了该应用程序.(不想自己强制卸载,因为以前的版本只删除包括已保存数据在内的所有内容).
据我所知,MUI2.nsh中有预定义的模板,用于许可证,安装文件夹,进度指示器等.如何在安装程序流程的此阶段添加验证?
更新 - 尝试了保罗的解决方案,但它不起作用.在脚本的顶部,我已经声明了
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE validateDirectory
!insertmacro MUI_PAGE_DIRECTORY
Run Code Online (Sandbox Code Playgroud)
引用此功能:
Function validateDirectory
ReadRegStr $R0 HKLM "SOFTWARE\Aadhaar Enrolment Client" "Installdir"
Pop $R0
StrCmp $R0 $OUTDIR +1 +3
MessageBox MB_ICONSTOP|MB_OK 'The directory $OUTDIR already exists.Please choose a different directory.'
Abort
FunctionEnd
Run Code Online (Sandbox Code Playgroud)
此功能显示消息,但不会中止.此外,如果我在目录选择页面中单击"返回"并再次单击向前,则只需继续安装.
我试图在注册表中查询程序的安装位置.我感兴趣的只是位置输出.
这个问题有部分解决方案,但它没有多大帮助.在Windows 7上,reg命令输出一个愚蠢的注册表项标题以及值,如下所示:
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NSIS Unicode" /v InstallLocation
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NSIS Unicode
InstallLocation REG_EXPAND_SZ C:\Program Files\NSIS
Run Code Online (Sandbox Code Playgroud)
首先,有没有办法关闭标题并简化输出?
在命令提示符下,我可以将上面的内容更改为
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NSIS Unicode" /v InstallLocation | findstr InstallLocation
Run Code Online (Sandbox Code Playgroud)
所以它只返回第二行.
现在,如果我使用a FOR /F来解析它并只获取目录值,则FOR命令失败| was unexpected at this time.
这是我的批处理文件:
@for /f "tokens=2* delims= " %%k in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NSIS Unicode" /v InstallLocation | findstr InstallLocation') do @echo %%k
Run Code Online (Sandbox Code Playgroud)
那我哪里错了?
如上.我使用ExecWait专门运行Java程序,通过调用java.exe并传递类名.我正在运行的应用程序依赖于相对路径,必须从特定目录运行,但是当我直接调用java时,它只是使用安装程序位置作为当前目录而失败.
有办法解决这个问题吗?
更新:这是我的命令行:
ExecWait "$INSTDIR\MyApp\jre\bin\java.exe -cp $INSTDIR\MyApp\lib\*; MyJavaClassName"
Run Code Online (Sandbox Code Playgroud) nsis ×4
java ×3
windows ×3
process ×2
batch-file ×1
directory ×1
mnemonics ×1
registry ×1
swing ×1
windows-xp ×1