2017-08-14 7 views
0

私は次のバッチスクリプトを使用して、選択したファイルの名前とパスを取得する必要があります(私のOSは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 

しかし、このスニペットでは、現在のディレクトリ(スクリプトが実行されているディレクトリ)を初期ディレクトリにする必要があるのに対して、起動時に開かれる最初のディレクトリとして基本的な "コンピュータ"パスのみが許可されますファイル選択がトリガーされたとき。

誰かがVbscript/JscriptやPowershellでこれを達成するのを手助けできますか?このように、 "" と "17 ^" を置き換える

答えて

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のための実用的なソリューションは、それはページ下に非常に最後のバージョンです、Rob van der woudeが提供するが、世話をしています。

+0

このスクリプトをクリックして実行すると、コマンドウィンドウが開き、空白のままになり、ファイルダイアログはまったく開きません。 –

+0

現在のディレクトリを表示するようにバッチを変更しました。実行時に表示される内容を確認してください。私はあなたに完全なコピー/ペーストをしたことを伝えます。あなたはローカルドライブで試しましたか? – LotPings

+0

はいローカルドライブで試しましたが、前にも述べたように、GUIファイルダイアログは表示されませんでしたが、初期ディレクトリのパスは正しいですが、GUIが開いていない理由は分かりません。 ? –

0

試してみてください。

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

エラー '期待') '' –

+0

しかし、バッチにはコメントアウトされていますが(vbsではなく、エラーを再実行します)、使用していません。 Remはバッチ**と** vbscriptでコメントアウトすると有効です。あなたの提案にエスケープされた閉じ括弧がありません – LotPings

+0

私は 'rem'または' :: 'を削除してチェックしました。それ以外の場合は、ファイルを選択できなくなるでしょう。 'rem'はコマンドを無効にします。二重引用符でも二重引用符でもなくても、私はその行が機能していないと賞賛しました。 –

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

問題のOS情報を更新しました。 –

関連する問題