Что нового

Получить путь к файлу из строки параметров

musicstashall

Знающий
Сообщения
322
Репутация
7
Имеется замечательный способ от CreatoR:
Код:
Dim $aPath[10]

$aPath[0] = '"C:\Program Files\Unknown.dat\setup.exe" test.exe'
$aPath[1] = 'C:\Program Files\Unknown.dat\setup.exe test.exe'
$aPath[2] = 'C:\Program Files\Unknown.dat\setup.exe /d test.exe'
$aPath[3] = 'C:\Program Files\Unknown.dat\setup.exe test.exe /d'
$aPath[4] = 'C:\Program Files\Unknown.dat\setup.exe C:\#test.exe'
$aPath[5] = 'C:\Program Files\Unknown.dat\setup.exe #d C:\test.exe'
$aPath[6] = 'C:\Program Files\Unknown.dat\setup.exe test1.exe test2.exe'
$aPath[7] = 'C:\Program Files\Unknown.dat\setup.exe %1 -d -text.log'
$aPath[8] = 'explorer.exe C:\Program Files\test.txt'
$aPath[9] = 'explorer.exe %1 -a -b ...'

$sQuotes_Pattern = '(?:"?)+' ;Кавычки (опционально, могут содержаться в множественном числе - подряд).
$sPath_Pattern = '((?:.*\\)?.*?\..*?)' ;Извлекаемый путь (с учётом точки и расширение имени файла).
$sParams_Pattern = ' (.*)$' ;Параметры (пробел после пути, и всё что после).

$sPattern = $sQuotes_Pattern & $sPath_Pattern & $sQuotes_Pattern & $sParams_Pattern
$sReplace = '\1' ;Замена (используется в закомментированном RegExpReplace), в данном случае нам нужна только первая группа, т.е извлекаемый путь

For $i = 0 To UBound($aPath) - 1
    $aRet = StringRegExp($aPath[$i], $sPattern, 3)
   
    ConsoleWrite("[" & $aPath[$i] & "]" & @LF)
   
    For $j = 0 To UBound($aRet)-1
        ConsoleWrite(@TAB & $j & ": " & $aRet[$j] & @LF)
    Next
   
;~  ConsoleWrite(@TAB & "[RegExpReplace] " & StringRegExpReplace($aPath[$i], $sPattern, $sReplace) & @CRLF)
    ConsoleWrite(@LF)
Next


Но в нем отсутствует один нужный вариант — если строка такая C:\Program Files\Unknown.dat\setup.exe /s C:\test.exe /s
То есть, в параметрах имеется тоже путь к файлу с параметрами.
Я эту тему так и не усвоил, она для меня сложная. Прошу помочь внести корректировочку в паттерн от CreatoR

Хотелось бы так же получить массив путей из строки параметра, чтобы его обработать в нужном порядке. Либо включать варианты паттернов для извлечения первого пути или последнего.
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
xXx сказал(а):
OffTopic:
Возможно логичнее использовать _WinAPI_GetProcessFileName() и _WinAPI_GetProcessCommandLine()?

Пасиб, но это совсем не то.
А как надо то... Народ, выручите. Мистер CreatoR!!


Добавлено:
Сообщение автоматически объединено:

Например, такая строка:
Код:
"C:\Windows\System32\RUNDLL32.EXE" "C:\Windows\System32\scrobj.dll",GenerateTypeLib "%1"

Мне нужно получить путь к C:\Windows\System32\scrobj.dll
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
StringSplit
_StringBetween

раз нужно получить массив путей. второй в массиве будет параметр содержащий пути.
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
musicstashall сказал(а):
Хотелось бы так же получить массив путей из строки параметра

Код:
$sStr = 'C:\Windows\System32\RUNDLL32.EXE "C:\Windows\System32\scrobj.dll",GenerateTypeLib "%1"'
$aArray = StringRegExp($sStr, '([[:alpha:]]\:\\.*?\.\w+)(?:\W|$)', 3)

ConsoleWrite('![' & $sStr & ']' & @LF)
For $j = 0 To UBound($aArray) - 1
	ConsoleWrite('!' & @TAB & $j & ': [' & $aArray[$j] & ']' & @LF)
Next

Это будет работать только в том случае, если пути содержат расширение файла.
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
xXx сказал(а):
musicstashall сказал(а):
Хотелось бы так же получить массив путей из строки параметра

Код:
$sStr = 'C:\Windows\System32\RUNDLL32.EXE "C:\Windows\System32\scrobj.dll",GenerateTypeLib "%1"'
$aArray = StringRegExp($sStr, '([[:alpha:]]\:\\.*?\.\w+)(?:\W|$)', 3)

ConsoleWrite('![' & $sStr & ']' & @LF)
For $j = 0 To UBound($aArray) - 1
	ConsoleWrite('!' & @TAB & $j & ': [' & $aArray[$j] & ']' & @LF)
Next

Это будет работать только в том случае, если пути содержат расширение файла.

Подтверждаю, это работает с последней моей строкой, но с другими уже не работает

Код:
%SystemRoot%\System32\cmd.exe /C "%1" %*
Код:
%windir%\system32\mmc.exe /s %SystemRoot%\system32\devmgmt.msc /s
Код:
%SystemRoot%\System32\rundll32.exe "%ProgramFiles%\Windows Photo Viewer\PhotoViewer.dll", ImageView_Fullscreen %1
Код:
%SystemRoot%\system32\rundll32.exe %SystemRoot%\system32\shell32.dll,Control_RunDLL %SystemRoot%\system32\desk.cpl desk,@Appearance /Action:OpenMSTheme /file:"%1"



Добавлено:
Сообщение автоматически объединено:

joiner сказал(а):
Код:
StringSplit
_StringBetween

раз нужно получить массив путей. второй в массиве будет параметр содержащий пути.

Это, похоже, с регулярными выражениями не работает. Интересная функа, но, видимо, не для нашего случая
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
musicstashall сказал(а):
но с другими уже не работает
Код:
#include <WinAPI.au3>
Global $aPath[6]

$aPath[0] = 'C:\Program Files\Unknown.dat\setup.exe /s C:\test.exe /s' 
$aPath[1] = 'C:\Windows\System32\RUNDLL32.EXE "C:\Windows\System32\scrobj.dll",GenerateTypeLib "%1"'
$aPath[2] = '%SystemRoot%\System32\cmd.exe /C "%1" %*'
$aPath[3] = '"%windir%\system32\mmc.exe" /s "%SystemRoot%\system32\devmgmt.msc" /s'
$aPath[4] = '%SystemRoot%\System32\rundll32.exe "%ProgramFiles%\Windows Photo Viewer\PhotoViewer.dll", ImageView_Fullscreen %1'
$aPath[5] = '"%SystemRoot%\system32\rundll32.exe" %SystemRoot%\system32\shell32.dll,Control_RunDLL %SystemRoot%\system32\desk.cpl desk,@Appearance /Action:OpenMSTheme /file:"%1"'

For $i = 0 To UBound($aPath) - 1
	$aArray = StringRegExp(_WinAPI_ExpandEnvironmentStrings($aPath[$i]), '([[:alpha:]]\:\\.*?\.\w+)(?:\W|$)', 3)
	$sStr = @LF & '-[' & $aPath[$i] & ']' & @LF
	For $j = 0 To UBound($aArray) - 1
		$sStr &= '+' & @TAB & $j & ': [' & $aArray[$j] & ']' & @LF
	Next
	ConsoleWrite($sStr)
Next
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
На офф сайте подсказали:

Код:
#include <Array.au3>
#include <WinAPIShPath.au3>

Global $aPath[5]

$aPath[0] = '%SystemRoot%\System32\cmd.exe /C "%1" %*'
$aPath[1] = '%windir%\system32\mmc.exe /s %SystemRoot%\system32\devmgmt.msc /s'
$aPath[2] = '%SystemRoot%\System32\rundll32.exe "%ProgramFiles%\Windows Photo Viewer\PhotoViewer.dll", ImageView_Fullscreen %1'
$aPath[3] = '%SystemRoot%\system32\rundll32.exe %SystemRoot%\system32\shell32.dll,Control_RunDLL %SystemRoot%\system32\desk.cpl desk,@Appearance /Action:OpenMSTheme /file:"%1"'
$aPath[4] = 'C:\Windows\System32\RUNDLL32.EXE "C:\Windows\System32\scrobj.dll",GenerateTypeLib "%1"'

Global $aArgs = 0
For $i = 0 To UBound($aPath) - 1
    ConsoleWrite("Path only: " & _WinAPI_PathRemoveArgs($aPath[$i]) & "   Arguments: " & _WinAPI_PathGetArgs($aPath[$i]) & @CRLF)
    $aArgs = _WinAPI_CommandLineToArgv($aPath[$i])
    _ArrayDisplay($aArgs, "Path & Arguments Array")
Next



Добавлено:
Сообщение автоматически объединено:

Даже не знаю теперь, чем лучше воспользоваться. Оба примера хороши. :IL_AutoIt_1:
 
Верх