2017-08-14 39 views
0

我有以下批处理脚本打开从中我需要的姓名和所选文件的路径的文件选择对话框(我的操作系统是Windows 7 64Bit):批处理脚本打开当前目录或选择使用PowerShell/vbscrpt命令的目录

@echo off 
setlocal 

> "%temp%\fileSelectorDialog.vbs" (
    echo DIM objFile 
    echo Set objShell = CreateObject^("Shell.Application" ^) 
    echo Do 
    echo Set objFile = objShell.BrowseForFolder^(0,"Select a file",^&H4000,""^) 
    echo on error resume next 
    echo if objFile.Items.Item.Path = Null OR objFile is nothing OR err.number ^<^> 0 then 
    echo wscript.echo "ERROR" 
    echo wscript.quit 
    echo end if 
    echo wscript.echo objFile.ParentFolder.ParseName^(objFile.Title^).path 
    echo if instr^(objFile.items.item.path,"."^)^>0 then 
    echo wscript.echo objFile.Items.Item.Path 
    echo wscript.quit 
    echo end if 
    echo Msgbox "Please try again to choose a file rather than a folder. " ^& objFile.items.item.path 
    echo Loop 
) 

set file=ERROR 
for /f "tokens=*" %%a in ('cscript //nologo "%temp%\fileSelectorDialog.vbs"') do set file=%%a 
if "%file%"=="ERROR" (
echo There was an error or you cancelled 
) ELSE (
echo Path chosen was %file% 
) 
pause 

但是这段代码只允许基本的“Computers”路径作为我触发时打开的初始目录,而我需要将我当前的目录(执行脚本的目录)作为初始目录当文件选择被触发时。

有人可以帮助我通过Vbscript/Jscript或Powershell来实现吗?

回答

1

一个批 - PowerShell混合文件,不使用临时文件。
此批处理需要比Win7提供的PsV2更新的PowerShell版本。

<# : batch portion (begins with PowerShell multi-line comment block) 
:: from rojo/npocmaka http://stackoverflow.com/a/41195176/1683264 
@echo off & setlocal 
Set "InitialDir=%CD%" 
Echo InitialDir=%InitialDir% 
For /f "delims=" %%A in (
'powershell -noprofile -NoLogo "iex (${%~f0} | out-string)"' 
) Do Set "File=%%A 

Echo You selected file %file% 
Pause 

Exit /b 

: ---------------- end batch/begin PowerShell hybrid --------------------#> 

[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null 
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog 
$OpenFileDialog.initialDirectory = $Env:initialDir 
#$OpenFileDialog.filter = "Text (*.txt) | *.txt | All Files| *.*" 
$OpenFileDialog.ShowDialog() | Out-Null 
$OpenFileDialog.filename 

保存与.bat.cmd扩展和运行 - 将使用当前目录。

this question还有另一个batch-powershell hybrid by rojo,它也与PowerrShell V2一起使用。


vbscript A工作液是由Rob van der woude提供,但照顾,它的最后一个版本下跌的一页。

+0

这个脚本,当我通过点击它来执行它时,它只是打开命令窗口并保持空白,并且文件对话框根本不会打开。 –

+0

更改批次以显示当前目录,请检查运行时显示的内容。我打算你做了一个完整的复制/粘贴。你尝试使用本地驱动器吗? – LotPings

+0

是在本地驱动器上试过,但GUI文件对话框从不出现,正如我之前所说的,初始目录路径是正确的,但我不明白它为什么不打开GUI文件选择对话框,如Windows操作系统本地文件? –

0

尝试用 “” 代替 “17 ^”,像这样:

:: echo Set objFile = objShell.BrowseForFolder^(0,"Select a file",^&H4000,"") 
+0

仍然给出错误'预期')'' –

+0

但批注出来(不适用于vbs - 会重新发生错误),这是没有用的。 Rem在批处理**和** vbscript中有效用于注释。您的建议缺少逃脱的右括号 – LotPings

+0

Ofcourse我删除了'rem'或'::'并进行了检查。否则我不能选择文件,'rem'使命令被禁用,无论是双qwotes还是没有双引号,我已经表示该行因为它不工作而被称赞。 –

0

看看下面的VBScript示例:

Option Explicit 
Dim sIniDir, sFilter, sTitle, sShowInTaskBar 
  
sIniDir = "C:\*" 
sFilter = "All files (*.*)|*.*|Microsoft Word (*.doc;*.docx)|*.doc;*.docx" 
sTitle = "GetFileDlg" 
sShowInTaskBar = "yes" 

MsgBox GetFileDlg(sIniDir, sFilter, sTitle, sShowInTaskBar) 

Function GetFileDlg(sIniDir, sFilter, sTitle, sShow) 
   ' source http://forum.script-coding.com/viewtopic.php?pid=75356#p75356 
    Dim sSignature, oShellWnd, oWnd, oProc 
    sSignature = Left(CreateObject("Scriptlet.TypeLib").Guid, 38) 
    Set oProc = CreateObject("WScript.Shell").Exec("mshta ""about:<script>moveTo(-32000,-32000);document.title=' '</script><object id=d classid=clsid:3050f4e1-98b5-11cf-bb82-00aa00bdce0b></object><object id=s classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>s.putproperty('" & sSignature & "',document.parentWindow);function q(i,f,t){return d.object.openfiledlg(i,null,f,t)};</script><hta:application showintaskbar=" & sShow & "/>""") 
   On Error Resume Next 
    Do 
        If oProc.Status > 0 Then 
            GetFileDlg = "" 
           Exit Function 
        End If 
       For Each oShellWnd In CreateObject("Shell.Application").Windows 
           Err.Clear 
           Set oWnd = oShellWnd.GetProperty(sSignature) 
           If Err.Number = 0 Then Exit Do 
        Next 
    Loop 
    On Error GoTo 0 
    oWnd.Document.Title = sTitle 
    GetFileDlg = oWnd.q(sIniDir, sFilter, sTitle) 
    oWnd.Close 
End Function 

Source

+0

这只是在文件选择对话框中打开脚本当前目录的父目录,我需要脚本的当前目录作为文件选择对话框中的默认打开路径。 –

+0

我已经在问题中更新了我的操作系统信息,如果这可能会有所帮助。 –

相关问题