Windows批处理脚本中的文件夹选择器对话框

时间:2013-11-01 20:32:16

标签: windows batch-file vbscript cmd folderbrowserdialog

如何实现以下代码:

@if (@a==@b) @end /*

:: fchooser2.bat
:: batch portion

    @echo off
    setlocal

    for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0"') do (
        echo You chose %%I
    )

    goto :EOF

    :: JScript portion */

    var shl = new ActiveXObject("Shell.Application");
    var folder = shl.BrowseForFolder(0, "Please choose a folder.", 0, 0x00);
    WSH.Echo(folder ? folder.self.path : '');

具有以下结果:

Result

在此代码中:

@echo off 
color a

app\arc x -ep1 -i2 -w. -dp.\OUTLAST_REPACK_GZK\Outlast DATA_0.bin -msrep:d
app\arc x -ep1 -i2 -w. -dp.\OUTLAST_REPACK_GZK\Outlast\_CommonRedist DATA_1.bin -msrep:d
app\arc x -ep1 -i2 -w. -dp.\OUTLAST_REPACK_GZK\Outlast\OLGame DATA_2.bin -msrep:d
app\arc x -ep1 -i2 -w. -dp.\OUTLAST_REPACK_GZK\Outlast\Engine DATA_3.bin -msrep:d
app\arc x -ep1 -i2 -w. -dp.\OUTLAST_REPACK_GZK\Outlast\Binaries DATA_4.bin -msrep:d

选择目标文件夹以批量提取文件。

像以下或其他方式一样,我不知道如何做到这一点:

app\arc x -ep1 -i2 -w. -dp.\%FCHOOSER2%\Outlast DATA_0.bin -msrep:d

3 个答案:

答案 0 :(得分:0)

假设您有两个脚本,一个调用目录选择对话框,另一个执行一系列app\arc命令,在两个单独的文件中,您可以尝试以这种方式修改前者:

@if (@a==@b) @end /*

:: fchooser2.bat
:: batch portion

@echo off
setlocal

for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0"') do (
    cd /d "%%~I\.."
)

call myarchive.bat

goto :EOF

:: JScript portion */

var shl = new ActiveXObject("Shell.Application");
var folder = shl.BrowseForFolder(0, "Please choose a folder.", 0, 0x00);
WSH.Echo(folder ? folder.self.path : '');

如您所见,对话框返回的路径在cd /d命令中用于更改为对话框中所选目录的父目录。 (它更改为父级,因为假定所选目录是后续OUTLAST_REPACK_GZK命令中引用的app\arc。)

然后脚本继续调用myarchive.bat,这被认为是另一个批处理文件的名称,即运行app\arc命令的文件。 (您可能需要将此名称更改为真实名称。)

答案 1 :(得分:0)

这应该有效 - 但我不确定-dp开关和语句与句点。检查arc.exe文档。

pause将允许您阅读任何错误消息。

@if (@a==@b) @end /*

:: fchooser2.bat
:: batch portion

    @echo off
    setlocal

    for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0"') do (
        echo You chose "%%I"
        set "folder=%%I"
    )


@echo off 
color a



app\arc x -ep1 -i2 -r -w. -dp"%folder%\Outlast" DATA_0.bin -msrep:d
app\arc x -ep1 -i2 -r -w. -dp"%folder%\Outlast\_CommonRedist" DATA_1.bin -msrep:d
app\arc x -ep1 -i2 -r -w. -dp"%folder%\Outlast\OLGame" DATA_2.bin -msrep:d
app\arc x -ep1 -i2 -r -w. -dp"%folder%\Outlast\Engine" DATA_3.bin -msrep:d
app\arc x -ep1 -i2 -r -w. -dp"%folder%\Outlast\Binaries" DATA_4.bin -msrep:d
pause

    goto :EOF

    :: JScript portion */

    var shl = new ActiveXObject("Shell.Application");
    var folder = shl.BrowseForFolder(0, "Please choose a folder.", 0, 0x00);
    WSH.Echo(folder ? folder.self.path : '');

答案 2 :(得分:0)

非常感谢您的回答foxidrive。我用它来实现以下内容:

@if (@a==@b) @end /*

:: fchooser2.bat
:: batch portion

@echo off
setlocal

for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0"') do (
    set FLDR=%%I
)
app\arc x -ep1 -i2 -r -w. -dp"%FLDR%\outlast" DATA_0.bin -msrep:d
goto :EOF

:: JScript portion */

var shl = new ActiveXObject("Shell.Application");
var folder = shl.BrowseForFolder(0, "Elija la carpeta de instalacion.", 0, 0x00);
WSH.Echo(folder ? folder.self.path : '');

-r 选项是以下行中的键,它表示递归。

app\arc x -ep1 -i2 -r -w. -dp"%FLDR%\outlast" DATA_0.bin -msrep:d