दिलचस्प पोस्ट
साझा पुस्तकालयों को लिंक करते समय प्रतीकों की दृश्यता सीमित करना जावास्क्रिप्ट में स्थिर चर जावास्क्रिप्ट में स्ट्रिंग की तुलना करते समय एक स्ट्रिंग दूसरे से ज्यादा क्यों है? डॉक करने वाले कंटेनर से मेजबान पोर्ट का उपयोग कैसे करें सी ++ 11 टाइप नहीं निकालता है जब std :: function या lambda फ़ंक्शंस शामिल होते हैं तत्व के मुताबिक माउस की स्थिति का पता लगाएं डेटाबेस में आप प्रभावशाली मॉडल कैसे प्राप्त कर सकते हैं? इवेंट जब उपयोगकर्ता स्क्रॉल करना बंद कर देता है कैसे मजबूत पैरामीटर के साथ एक सरणी की अनुमति के लिए चार * str = "STRING" के बीच अंतर और चार अक्ष = "STRING"? Grails में SQL कथन लॉग इन कैसे करें एंड्रॉइड स्क्रीनशॉट की सतह के दृश्य को ब्लैक स्क्रीन दिखाता है कोणीय कलेक्शन में कम्पाइल और लिंक फंक्शन में अंतर क्या है एक बाइट सरणी को सी # में एक फ़ाइल में लिखा जा सकता है? क्या स्ट्रिंग और इंट के साथ एक चर को संदर्भित करना संभव है?

विंडोज़ बैच स्क्रिप्ट से फ़ाइल / फ़ोल्डर चयनकर्ता संवाद

आमतौर पर, यूजर को एक बैच स्क्रिप्ट के लिए फाइल नाम की आपूर्ति करने को कहा जा रहा है एक गड़बड़ मामला है, जिसमें कोई गलत वर्तनी नहीं है, रिक्त स्थान के साथ पथ के उद्धरण, और बहुत कुछ। दुर्भाग्य से, उपयोगकर्ता सटीकता के लिए अच्छी तरह से ज्ञात नहीं हैं। उन परिस्थितियों में जहां इनपुट फ़ाइल स्थान रनटाइम तक ज्ञात नहीं है, फ़ाइल चयन इनपुट के लिए GUI का उपयोग करके उपयोगकर्ता त्रुटि की संभावना कम हो जाती है।

क्या कोई File... Open कोई तरीका है File... Open एक विंडोज़ बैच स्क्रिप्ट से शैली गुइ फ़ाइल चयनकर्ता या फ़ोल्डर चयनकर्ता File... Open ?

यदि स्क्रिप्ट उपयोगकर्ता में PowerShell या .NET स्थापित है, तो यह संभव है। नीचे दिए गए उत्तर देखें

मुझे यह भी देखने में दिलचस्पी है कि किसी और को कौन से अन्य समाधान ऑफ़र कर सकता है।

वेब के समाधान से एकत्रित समाधान "विंडोज़ बैच स्क्रिप्ट से फ़ाइल / फ़ोल्डर चयनकर्ता संवाद"

फ़ाइल ब्राउज़र

2016.3.20 अपडेट करें:

चूंकि पावरशेल आजकल सभी आधुनिक विंडोज प्रतिष्ठानों का मूल घटक है, इसलिए मैं सी # फ़ॉलबैक को अब जरूरी नहीं बता रहा हूं। यदि आपको अभी भी विस्टा या एक्सपी अनुकूलता की आवश्यकता है, तो मैं इसे एक नए उत्तर में ले गया । इस संपादन के साथ शुरू, मैं स्क्रिप्ट को बैच + पावरशेफ हाइब्रिड के रूप में दोबारा लिख ​​रहा हूं और बहु-चयन करने की क्षमता को शामिल कर रहा हूं। आवश्यकता के अनुसार पढ़ना और ज़्यादा ज़्यादा करना आसान है।

 <# : chooser.bat :: launches a File... Open sort of file chooser and outputs choice(s) to the console :: https://stackoverflow.com/a/15885133/1683264 @echo off setlocal for /f "delims=" %%I in ('powershell -noprofile "iex (${%~f0} | out-string)"') do ( echo You chose %%~I ) goto :EOF : end Batch portion / begin PowerShell hybrid chimera #> Add-Type -AssemblyName System.Windows.Forms $f = new-object Windows.Forms.OpenFileDialog $f.InitialDirectory = pwd $f.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*" $f.ShowHelp = $true $f.Multiselect = $true [void]$f.ShowDialog() if ($f.Multiselect) { $f.FileNames } else { $f.FileName } 

यह एक फ़ाइल चयनकर्ता संवाद में परिणाम है।

फ़ाइल चयनकर्ता

चयन आउटपुट के परिणाम You chose C:\Users\me\Desktop\tmp.txt कंसोल में You chose C:\Users\me\Desktop\tmp.txt । यदि आप एकल फ़ाइल चयन को बल देना चाहते हैं, तो बस $f.Multiselect संपत्ति को $false परिवर्तित करें।

(PowerShell आदेश निर्दयतापूर्वक बस टिंकरिंग ब्लॉग से लिखे गए ।) अन्य फ़ील्ड के लिए OpenFileDialog क्लास दस्तावेज़ीकरण देखें जिन्हें आप सेट कर सकते हैं, जैसे कि Title और प्रारंभिक डायरेक्टरी ।


फ़ोल्डर ब्राउज़र

अपडेट 2015.08.10:

चूंकि फ़ोल्डर चयनकर्ता को चलाने के लिए पहले से ही कोई COM विधि है, इसलिए PowerShell वन-लाइनर बनाना आसान है जो फ़ोल्डर चयनकर्ता खोल सकता है और पथ को आउटपुट कर सकता है।

 :: fchooser.bat :: launches a folder chooser and outputs choice to the console :: https://stackoverflow.com/a/15885133/1683264 @echo off setlocal set "psCommand="(new-object -COM 'Shell.Application')^ .BrowseForFolder(0,'Please choose a folder.',0,0).self.path"" for /f "usebackq delims=" %%I in (`powershell %psCommand%`) do set "folder=%%I" setlocal enabledelayedexpansion echo You chose !folder! endlocal 

BrowseForFolder() विधि में, चौथे तर्क में पदानुक्रम की जड़ निर्दिष्ट करता है मान्य मानों की सूची के लिए ShellSpecialFolderConstants देखें।

यह एक फ़ोल्डर चयनकर्ता संवाद में परिणाम है।

यहां छवि विवरण दर्ज करें

चयन आउटपुट का परिणाम You chose C:\Users\me\Desktop को कंसोल में चुना है।

आपके द्वारा सेट किए जा सकने वाले अन्य गुणों के लिए FolderBrowserDialog वर्ग दस्तावेज़ देखें, जैसे कि RootFolder । मेरी मूल .NET System.Windows.Forms पावरशेलेम और सी # समाधान की आवश्यकता के उत्तर में इस संशोधन के 4 में पाया जा सकता है, लेकिन यह COM विधि को पढ़ने और बनाए रखने में काफी आसान है।

विंडोज स्क्रिप्ट होस्ट


फ़ाइल चयन

विंडोज एक्सपी में एक रहस्यमय UserAccounts.CommonDialog थी। UserAccounts.CommonDialog डब्लूएसएच ऑब्जेक्ट जो कि वीबीस्क्रिप्ट और जेस्क्रिप्ट को फाइल चयन प्रॉम्प्ट लॉन्च करने की इजाजत देता था । जाहिर है, यह एक सुरक्षा जोखिम समझा गया था और विस्टा में हटा दिया गया था।


फ़ोल्डर चयन

हालांकि, डब्लूएसएच शैल। एप्लिकेशन ऑब्जेक्ट ब्राउजफोरफोल्डर विधि अभी भी फ़ोल्डर चयन संवाद के निर्माण की अनुमति देगा। यहाँ एक हाइब्रिड बैच + जेस्क्रिप्ट उदाहरण है। इसे एक .bat एक्सटेंशन से बचाएं

 @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 : ''); 

फ़ोल्डर चयन संवाद

BrowseForFolder() विधि में, चौथे तर्क में पदानुक्रम की जड़ निर्दिष्ट करता है मान्य मानों की सूची के लिए ShellSpecialFolderConstants देखें।

यह ऊपर XP से काम करना चाहिए और एक हिब्रइड फ़ाइल की आवश्यकता नहीं है, यह सिर्फ एक लंबी कमांड लाइन के साथ एमएसटीए चलाता है:

 @echo off set dialog="about:<input type=file id=FILE><script>FILE.click();new ActiveXObject set dialog=%dialog%('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(FILE.value); set dialog=%dialog%close();resizeTo(0,0);</script>" for /f "tokens=* delims=" %%p in ('mshta.exe %dialog%') do set "file=%%p" echo selected file is : "%file%" pause 

एक फ़ाइल / फ़ोल्डर चयन शुद्ध बैच के साथ किया जा सकता है, जैसा कि नीचे दिखाया गया है। बेशक, लगता है और देखो एक जीयूआई के रूप में सुखद नहीं है, लेकिन यह बहुत अच्छी तरह से काम करता है और मेरी राय में यह GUI संस्करण से उपयोग करना आसान है। चयन विधि CHOICE कमांड पर आधारित है, इसलिए इसे इसे विंडोज संस्करणों में डाउनलोड करने की आवश्यकता होगी जो इसमें शामिल नहीं है और इसके मापदंडों को थोड़ा संशोधित करने के लिए। बेशक, कोड को आसानी से सीओटी / पी को विकल्प के बजाय सीईटी / पी के इस्तेमाल के लिए संशोधित किया जा सकता है, लेकिन यह परिवर्तन बहुत आसान और तेज़ चयन पद्धति को समाप्त करेगा, जिसे केवल नेविगेट करने और चयन करने के लिए एक कुंजीपैथी की आवश्यकता होती है।

 @echo off setlocal rem Select a file or folder browsing a directory tree rem Antonio Perez Ayala rem Usage examples of SelectFileOrFolder subroutine: call :SelectFileOrFolder file= echo/ echo Selected file from *.* = "%file%" pause call :SelectFileOrFolder file=*.bat echo/ echo Selected Batch file = "%file%" pause call :SelectFileOrFolder folder=/F echo/ echo Selected folder = "%folder%" pause goto :EOF :SelectFileOrFolder resultVar [ "list of wildcards" | /F ] setlocal EnableDelayedExpansion rem Process parameters set "files=*.*" if "%~2" neq "" ( if /I "%~2" equ "/F" (set "files=") else set "files=%~2" ) rem Set the number of lines per page, max 34 set "pageSize=30" set "char=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" rem Load current directory contents set "name[1]=<DIR> .." :ProcessThisDir set "numNames=1" for /D %%a in (*) do ( set /A numNames+=1 set "name[!numNames!]=<DIR> %%a" ) for %%a in (%files%) do ( set /A numNames+=1 set "name[!numNames!]= %%a" ) set /A numPages=(numNames-1)/pageSize+1 rem Show directory contents, one page at a time set start=1 :ShowPage set /A page=(start-1)/pageSize+1, end=start+pageSize-1 if %end% gtr %numNames% set end=%numNames% cls echo Page %page%/%numPages% of %CD% echo/ if %start% equ 1 (set base=0) else set "base=1" set /A lastOpt=pageSize+base, j=base for /L %%i in (%start%,1,%end%) do ( for %%j in (!j!) do echo !char:~%%j,1! - !name[%%i]! set /A j+=1 ) echo/ rem Assemble the get option message if %start% equ 1 (set "mssg=: ") else (set "mssg= (0=Previous page") if %end% lss %numNames% ( if "%mssg%" equ ": " (set "mssg= (") else set "mssg=%mssg%, " set "mssg=!mssg!Z=Next page" ) if "%mssg%" neq ": " set "mssg=%mssg%): " :GetOption choice /C "%char%" /N /M "Select desired item%mssg%" if %errorlevel% equ 1 ( rem "0": Previous page or Parent directory if %start% gtr 1 ( set /A start-=pageSize goto ShowPage ) else ( cd .. goto ProcessThisDir ) ) if %errorlevel% equ 36 ( rem "Z": Next page, if any if %end% lss %numNames% ( set /A start+=pageSize goto ShowPage ) else ( goto GetOption ) ) if %errorlevel% gtr %lastOpt% goto GetOption set /A option=start+%errorlevel%-1-base if %option% gtr %numNames% goto GetOption if defined files ( if "!name[%option%]:~0,5!" neq "<DIR>" goto endSelect ) else ( choice /C OS /M "Open or Select '!name[%option%]:~7!' folder" if errorlevel 2 goto endSelect ) cd "!name[%option%]:~7!" goto ProcessThisDir :endSelect rem Return selected file/folder for %%a in ("!name[%option%]:~7!") do set "result=%%~Fa" endlocal & set "%~1=%result% exit /B 

दो और तरीके

1.एक हाइब्रिड .bat / hta (एक bat रूप में सहेजा जाना चाहिए) लिपि का प्रयोग करना। यह vbscript या javascript का उपयोग कर सकता है लेकिन उदाहरण javascrtipt के साथ है। टेम्पलेट फ़ाइलों को नहीं बनाते हैं। फ़ोल्डर को चुनना इतना आसान नहीं है और एक बाहरी जावास्क्रिप्ट की आवश्यकता होगी पुस्तकालयों, लेकिन फ़ाइल का चयन करना आसान है

 <!-- : starting html comment :: FileSelector.bat @echo off for /f "tokens=* delims=" %%p in ('mshta.exe "%~f0"') do ( set "file=%%~fp" ) echo/ if not "%file%" == "" ( echo selected file is : %file% ) echo/ exit /b --> <Title>== FILE SELECTOR==</Title> <body> <script language='javascript'> function pipeFile() { var file=document.getElementById('file').value; var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1); close(fso.Write(file)); } </script> <input type='file' name='file' size='30'> </input><hr><button onclick='pipeFile()'>Submit</button> </body> 

1.1 – आरोजो द्वारा प्रस्तावित फार्म सबमिट किए बिना (टिप्पणियां देखें):

 <!-- : starting html comment :: FileSelector.bat @echo off for /f "tokens=* delims=" %%p in ('mshta.exe "%~f0"') do ( set "file=%%~fp" ) echo/ if not "%file%" == "" ( echo selected file is : "%file%" ) echo/ exit /b --> <Title>== FILE SELECTOR==</Title> <body> <script language='javascript'> function pipeFile() { var file=document.getElementById('file').value; var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1); close(fso.Write(file)); } </script> <input id='file' type='file' name='file' size='30' onchange='pipeFile()' > </input> <hr> <button onclick='pipeFile()'>Submit</button> <script>document.getElementById('file').click();</script> </body> 

2.आप पहले से ही पावरशेल्ड / नेट का प्रयोग कर रहे हैं, आप खुद को jscript.net हाइब्रिड बना सकते हैं। इसे संकलन के लिए अस्थायी सीएस फ़ाइल की आवश्यकता नहीं होगी और सीधे अंतर्निहित जेएससीआरआईपीटीएपी कंपाइलर का उपयोग करेगा। यहां शक्तियों की भी कोई ज़रूरत नहीं है और कोड कहीं अधिक पठनीय:

 @if (@X)==(@Y) @end /* JScript comment @echo off :: FolderSelectorJS.bat setlocal for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do ( set "jsc=%%v" ) if not exist "%~n0.exe" ( "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0" ) for /f "tokens=* delims=" %%p in ('"%~n0.exe"') do ( set "folder=%%p" ) if not "%folder%" == "" ( echo selected folder is %folder% ) endlocal & exit /b %errorlevel% */ import System; import System.Windows.Forms; var f=new FolderBrowserDialog(); f.SelectedPath=System.Environment.CurrentDirectory; f.Description="Please choose a folder."; f.ShowNewFolderButton=true; if( f.ShowDialog() == DialogResult.OK ){ Console.Write(f.SelectedPath); } 

बैच + पावरशेफ + सी # पॉलीग्लॉट समाधान

यह बैच + पावरशेफ हाइब्रिड के समान समाधान है, लेकिन सी # फॉलबैक सामान के साथ एक्सपी और विस्टा संगतता के लिए फिर से जोड़ा गया है। Xnightmare67x के अनुरोध पर एकाधिक फ़ाइल चयन जोड़ा गया है।

 <# : chooser_XP_Vista.bat :: // launches a File... Open sort of file chooser and outputs choice(s) to the console :: // https://stackoverflow.com/a/36156326/1683264 @echo off setlocal enabledelayedexpansion rem // Does powershell.exe exist within %PATH%? for %%I in ("powershell.exe") do if "%%~$PATH:I" neq "" ( set chooser=powershell -noprofile "iex (${%~f0} | out-string)" ) else ( rem // If not, compose and link C# application to open file browser dialog set "chooser=%temp%\chooser.exe" >"%temp%\c.cs" ( echo using System; echo using System.Windows.Forms; echo class dummy { echo public static void Main^(^) { echo OpenFileDialog f = new OpenFileDialog^(^); echo f.InitialDirectory = Environment.CurrentDirectory; echo f.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*"; echo f.ShowHelp = true; echo f.Multiselect = true; echo f.ShowDialog^(^); echo foreach ^(String filename in f.FileNames^) { echo Console.WriteLine^(filename^); echo } echo } echo } ) for /f "delims=" %%I in ('dir /b /s "%windir%\microsoft.net\*csc.exe"') do ( if not exist "!chooser!" "%%I" /nologo /out:"!chooser!" "%temp%\c.cs" 2>NUL ) del "%temp%\c.cs" if not exist "!chooser!" ( echo Error: Please install .NET 2.0 or newer, or install PowerShell. goto :EOF ) ) rem // Do something with the chosen file(s) for /f "delims=" %%I in ('%chooser%') do ( echo You chose %%~I ) rem // comment this out to keep chooser.exe in %temp% for faster subsequent runs del "%temp%\chooser.exe" >NUL 2>NUL goto :EOF :: // end Batch portion / begin PowerShell hybrid chimera #> Add-Type -AssemblyName System.Windows.Forms $f = new-object Windows.Forms.OpenFileDialog $f.InitialDirectory = pwd $f.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*" $f.ShowHelp = $true $f.Multiselect = $true [void]$f.ShowDialog() if ($f.Multiselect) { $f.FileNames } else { $f.FileName } 

XP या Vista के लिए फ़ोल्डर चयनकर्ता के लिए, या तो डब्लूएसएच समाधान या एनपीओस्कैका के एचटीए समाधान का उपयोग करें ।