批处理脚本使用 powershell / vbscrpt 命令打开当前目录或选择的目录

Batch script open current directory or directory of choice with powershell / vbscrpt command

我有以下批处理脚本来打开一个文件选择对话框,我需要从中获取所选文件的名称和路径(我的 OS 是 Windows 7 64Bit):

@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 帮助我实现这个目标吗?

尝试将“17^”替换为“”,如下所示:

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

看看下面的 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

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

<# : batch portion (begins with PowerShell multi-line comment block)
:: from rojo/npocmaka 
@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 there is another batch-powershell hybrid by rojo 中也适用于 PowerrShell V2。


vbscript 的工作解决方案由 Rob van der woude 提供,但请注意,这是页面下方的最后一个版本。