Показать полную графическую версию : [решено] Drag-and-drop нескольких файлов на bat
Подскажите, как сделать так, чтобы обрабатывались все файлы сразу за один проход, а не по одному как здесь:
@echo OFF
for %%i in (%*) do (
program %%i
)
exit
т.е. допустим program поддерживает команду program file1 file2 file3....
megaloman
01-08-2019, 15:09
@Echo Off
echo program %*
Pause
Exit /B
Echo, естественно, при реальной программе надо убить.
Сработало только без echo.
А если надо сделать так: program "file1|file2|file3".... на что надо заменить %* ???
megaloman
01-08-2019, 16:55
program "file1|file2|file3".... »@Echo Off
cls
If "%*"=="" (Echo No arguments &Pause &Exit /b 2)
Set "A="
For %%i In (%*) Do Call Set "A=%%A%%|%%i"
Call Set A="%A:~1%"
echo on
program %A%
Pause
Exit /B
В боевом варианте Echo on не нужен
На WSH:
Option Explicit
Const strPath2Programm = "c:\Windows\System32\notepad.exe"
Dim arrArguments()
Dim strArgument
Dim i
If WScript.Arguments.Count > 0 Then
ReDim arrArguments(WScript.Arguments.Count - 1)
For i = 0 To WScript.Arguments.Count - 1
WScript.Echo "[" & WScript.Arguments.Item(i) & "]"
arrArguments(i) = WScript.Arguments.Item(i)
Next
With WScript.CreateObject("Scripting.FileSystemObject")
If Not .FileExists(strPath2Programm) Then
WScript.Echo "Can't find programm file [" & strPath2Programm & "]."
WScript.Quit 2
End If
For Each strArgument In arrArguments
If Not .FileExists(strArgument) Then
WScript.Echo "Can't find source file [" & strArgument & "]."
WScript.Quit 3
End If
Next
End With
WScript.CreateObject("WScript.Shell").Run """" & strPath2Programm & """ """ & Join(arrArguments, "|") & """"
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file1> [<Source file2> [...<Source fileN>]]"
WScript.Quit 1
End If
WScript.Quit 0
megaloman, а если пробельные символы в имени файла?
megaloman
01-08-2019, 17:06
Iska, megaloman, а если пробельные символы в имени файла? » For %%i In (%*) Do Call Set "A=%%A%%|"%%~i""
Понятия не имею что с кавычками. Если можно program ""file1"|"file2"|"file3"" то »
Нет, только так: "file1|file2|file3"
megaloman
01-08-2019, 17:32
Iska, Sisin, @Echo Off
cls
If "%~1"=="" (Echo No arguments &Pause &Exit /b 2)
Set "A="
rem For %%i In (%*) Do Call Set "A=%%A%%|"%%~i""
For %%i In (%*) Do Call Set "A=%%A%%|%%~i"
Call Set A="%A:~1%"
echo on
program %A%
Pause
Exit /B
Получаю:
Z:\>program "fi le 1.txt|file1.txt|fi le 2.txt|file2.txt|fi le 3.txt|file3.txt"
"program" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Естественно такой программы у меня нет, но аргументы как заказывали
Я прошу прощения за назойливость, но как теперь получить аргументы вида "file1" "file2" "file3".... из конкретной папки, например, C:\temp??
Sisin, перечислить все файлы из каталога, который перетаскивается на пакетный файл/скрипт? И в каком именно конечном виде они нужны?
megaloman
01-08-2019, 18:36
Sisin, Откуда берутся "file1" "file2" "file3".... ? Из аргументов при запуске скрипта? Вы выделяете эти файлы в проводнике и затягиваете выделенное на значок скрипта? Или Вам надо взять все файлы из какого-то указанного Вами каталога?
Что в аргументах скрипта при его запуске?
1. Список файлов
2. Одна папка с файлами
3. Ничего. В самом скрипте прописана папка, откуда надо взять все файлы?
4. Ничего. В самом скрипте прописан список файлов?
program1 получает файлы от меня путем drag-and-drop на батник, аргументы "file1|file2|file3", обрабатывает их и складывает в папку, например, C:\TEMP.
program2 забирает их из папки C:\TEMP, аргументы "file1" "file2" "file3", обрабатывает и складывает в виде одного файла рядом с батником.
PS: Хотел вторую часть сам дописать, но не получилось(((
Sisin, а откуда пакетный файл/скрипт узнает данное имя каталога:
…и складывает в папку, например, C:\TEMP.
…забирает их из папки C:\TEMP, …»
?
…и складывает в папку, например, C:\TEMP.
…забирает их из папки C:\TEMP, …» »
В батнике будет прописано. Это каталог (для примера), который создается при запуске батника и удаляется в конце.
В аргументах к program1 он указывается.
Ну, например, так:
Option Explicit
Const strPath2Programm1 = "c:\Windows\System32\notepad.exe"
Const strPath2Programm2 = "c:\Windows\System32\calc.exe"
Const strPath2Folder = "%Temp%\Some folder"
Const intWindowStyle = 1 ' Activates and displays a window.
' If the window is minimized or maximized,
' the system restores it to its original size
' and position. An application should specify
' this flag when displaying the window
' for the first time.
Dim arrArguments()
Dim strArgument
Dim i
Dim objWshShell
Dim strPath2WorkFolder
If WScript.Arguments.Count > 0 Then
ReDim arrArguments(WScript.Arguments.Count - 1)
For i = 0 To WScript.Arguments.Count - 1
WScript.Echo "[" & WScript.Arguments.Item(i) & "]"
arrArguments(i) = WScript.Arguments.Item(i)
Next
Set objWshShell = WScript.CreateObject("WScript.Shell")
With WScript.CreateObject("Scripting.FileSystemObject")
If Not .FileExists(strPath2Programm1) Then
WScript.Echo "Can't find programm file [" & strPath2Programm1 & "]."
WScript.Quit 2
End If
If Not .FileExists(strPath2Programm2) Then
WScript.Echo "Can't find programm file [" & strPath2Programm2 & "]."
WScript.Quit 3
End If
For Each strArgument In arrArguments
If Not .FileExists(strArgument) Then
WScript.Echo "Can't find source file [" & strArgument & "]."
WScript.Quit 4
End If
Next
strPath2WorkFolder = objWshShell.ExpandEnvironmentStrings(strPath2Folder)
If Not .FolderExists(strPath2WorkFolder) Then
.CreateFolder strPath2WorkFolder
End If
objWshShell.Run """" & strPath2Programm1 & """ /WorkFolderParameter """ & strPath2WorkFolder & """ """ & Join(arrArguments, "|") & """", intWindowStyle, True
objWshShell.Run """" & strPath2Programm2 & """ /WorkFolderParameter """ & strPath2WorkFolder & """ """ & Join(arrArguments, """ """) & """", intWindowStyle, True
If .FolderExists(strPath2WorkFolder) Then
.DeleteFolder strPath2WorkFolder, True
End If
End With
Set objWshShell = Nothing
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file1> [<Source file2> [...<Source fileN>]]"
WScript.Quit 1
End If
WScript.Quit 0
Ну, например, так: »
Это очень круто)
Но как подправить этот вариант:
@echo Off
Set "A="
For %%i In ("C:\Temp\*") Do Call Set "A=%%A%%" "%%i"
Call Set A="%A:~1%"
program.exe %A%
pause
На выходе получается: program.exe " "file1" "file2" "file3". Как убрать одну лишнюю кавычку, которая идет сразу после program.exe????
megaloman
02-08-2019, 12:08
program1 получает файлы от меня путем drag-and-drop на батник, аргументы "file1|file2|file3", »
При этом в аргументах скрипта file1,2,3 .... передаются полными именами (то есть полным путём: Z:\tralala\file1 ....), что, подозреваю, для program1 норма. Если program1 забросил после обработки файлы в иную, создаваемую Вами папку, то для program2 в аргументе, соответственно, надо указывать новые имена. @Echo Off
cls
Set "DirTmp=Z:\Tmp.dir"
If "%~1"=="" (Echo No arguments &Pause &Exit /b 2)
If Exist "%DirTmp%" Rd /S /Q "%DirTmp%"
Md "%DirTmp%"
Set "A="
Set "B="
rem For %%i In (%*) Do Call Set "A=%%A%%|"%%~i"" &Call Set "B=%%A%%|"%DirTmp%\%%~nxi""
For %%i In (%*) Do Call Set "A=%%A%%|%%~i" &Call Set "B=%%B%%|%DirTmp%\%%~nxi"
Call Set A="%A:~1%"
Call Set B="%B:~1%"
echo on
program1 %A%
program2 %B%
Rd /S /Q "%DirTmp%"
Pause
Exit /B
РезультатZ:\>program1 "Z:\Soft_In\file1.mp3|Z:\Soft_In\file2.mp3|Z:\Soft_In\file3.mp3|Z:\Soft_In\file4.mp3"
"program1" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Z:\>program2 "Z:\Tmp.dir\file1.mp3|Z:\Tmp.dir\file2.mp3|Z:\Tmp.dir\file3.mp3|Z:\Tmp.dir\file4.mp3"
"program2" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
megaloman
02-08-2019, 12:27
Как убрать одну лишнюю кавычку, которая идет сразу после program.exe???? »Не надо её убирать, надо её не делать.@Echo Off
cls
Set "DirTmp=Z:\Tmp.dir"
Set "Prog=Program.exe"
For %%i In ("%DirTmp%\*.*") Do Call Set "Prog=%%Prog%% "%%i""
echo on
%Prog%
Pause
Exit /B
Либо@Echo Off
cls
Set "DirTmp=Z:\Tmp.dir"
Set "Arg="
For %%i In ("%DirTmp%\*.*") Do Call Set "Arg=%%Arg%% "%%i""
echo on
Program.exe%Arg%
Pause
Exit /B
echo on сделано для отладки.
Результат Z:\>Program.exe "Z:\Tmp.dir\file1.mp3" "Z:\Tmp.dir\file2.mp3" "Z:\Tmp.dir\file3.mp3" "Z:\Tmp.dir\file4.mp3"
Супер) Собрал из частей как надо.
Остался один момент: program2 имеет аргумент вывода конечного файла вида program2 "file1" "file1" "file1" -out fileout. При запуске батника напрямую (из папки, в которой он лежит) конечный файл создается в той папке, из которой драгенддропнули файлы на батник. При запуске батника через ярлык конечный файл создается в папке с батником.
Можно ли сделать, чтобы при запуске батника через ярлык, конечный файл создавался в той папке, из которой драгенддропнули файлы на батник?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.