小编Rex*_*Rex的帖子

NSIS - File/x不排除声明的文件/目录

我有一个需要添加到安装程序的目录结构.我有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有更好的文档或列出其命令参数/语法的警告.(/咆哮)

directory nsis

8
推荐指数
2
解决办法
7139
查看次数

使用ProcessBuilder/Runtime.exec()启动的外部进程在XP上失败,适用于Win 7

我正在开发一个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(). …

java windows windows-xp process

6
推荐指数
2
解决办法
3102
查看次数

如何根据命令行参数有条件地编译NSIS脚本?

我试图通过外部传递版本号来概括设置文件.我希望能够这样做:

makensis myscript.nsi parameter=value
Run Code Online (Sandbox Code Playgroud)

然后读取脚本中的参数,以便使用相同的脚本生成不同版本的可执行文件.我找到了这个这个,但它们似乎是用于将命令行参数传递给生成的setup.exe.这有可能,怎么样?

nsis

5
推荐指数
1
解决办法
2647
查看次数

Java Swing 中冲突的助记符

我正在开发一个复杂的桌面应用程序,其中包含多个用于工作流的选项卡式窗格,每个窗格都塞满了不同的按钮、标签和其他 UI 元素。它们中的每一个都需要一个定义的助记符,而这些经常因为用完要定义的字母而发生冲突。

我注意到在 Windows 上,如果为两个控件定义了相同的助记符,则按下它会在它们之间循环,并在释放键时激活它们。使用 Swing,如果您使用相同的键定义其中的 2 个,助记符将不会激活。

有解决方法吗?

java swing mnemonics

5
推荐指数
1
解决办法
718
查看次数

NSIS - 强制用户选择其他目录

到目前为止,我已经找到了如何通过读取注册表项来检测以前的软件安装,并测试该目录是否存在.(两者都在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 nsis

4
推荐指数
1
解决办法
1860
查看次数

在Windows上使用for/f的管道命令(使用reg查询)

我试图在注册表中查询程序的安装位置.我感兴趣的只是位置输出.

这个问题有部分解决方案,但它没有多大帮助.在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)

那我哪里错了?

windows registry batch-file

3
推荐指数
1
解决办法
5572
查看次数

NSIS - 在运行之前设置进程的工作目录

如上.我使用ExecWait专门运行Java程序,通过调用java.exe并传递类名.我正在运行的应用程序依赖于相对路径,必须从特定目录运行,但是当我直接调用java时,它只是使用安装程序位置作为当前目录而失败.

有办法解决这个问题吗?

更新:这是我的命令行:

ExecWait "$INSTDIR\MyApp\jre\bin\java.exe -cp $INSTDIR\MyApp\lib\*; MyJavaClassName"
Run Code Online (Sandbox Code Playgroud)

java nsis process

1
推荐指数
1
解决办法
5198
查看次数