Автор Тема: Получить путь к файлу из строки параметров  (Прочитано 336 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 208
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Имеется замечательный способ от CreatoR:
Код: AutoIt [Выделить]
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

Хотелось бы так же получить массив путей из строки параметра, чтобы его обработать в нужном порядке. Либо включать варианты паттернов для извлечения первого пути или последнего.
« Последнее редактирование: Ноябрь 10, 2018, 13:13:26 от musicstashall »

Русское сообщество AutoIt

Получить путь к файлу из строки параметров
« Отправлен: Ноябрь 10, 2018, 13:03:39 »

Оффлайн xXx [?]

  • Новичок
  • *
  • Сообщений: 42
  • Репутация: 11
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
OffTopicВозможно логичнее использовать _WinAPI_GetProcessFileName() и _WinAPI_GetProcessCommandLine()?

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 208

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
OffTopicВозможно логичнее использовать _WinAPI_GetProcessFileName() и _WinAPI_GetProcessCommandLine()?

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


Добавлено: Ноябрь 10, 2018, 22:48:16
Например, такая строка:
"C:\Windows\System32\RUNDLL32.EXE" "C:\Windows\System32\scrobj.dll",GenerateTypeLib "%1"
Мне нужно получить путь к C:\Windows\System32\scrobj.dll

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2810
  • Репутация: 473
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Код: AutoIt [Выделить]
раз нужно получить массив путей. второй в массиве будет параметр содержащий пути.
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Русское сообщество AutoIt

Re: Получить путь к файлу из строки параметров
« Ответ #3 Отправлен: Ноябрь 11, 2018, 21:28:25 »

Оффлайн xXx [?]

  • Новичок
  • *
  • Сообщений: 42
  • Репутация: 11
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Хотелось бы так же получить массив путей из строки параметра

Код: AutoIt [Выделить]
$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

Это будет работать только в том случае, если пути содержат расширение файла.
« Последнее редактирование: Ноябрь 12, 2018, 00:21:38 от xXx »

Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 208

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Хотелось бы так же получить массив путей из строки параметра

Код: AutoIt [Выделить]
$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"


Добавлено: Ноябрь 12, 2018, 07:09:32
Код: AutoIt [Выделить]
раз нужно получить массив путей. второй в массиве будет параметр содержащий пути.

Это, похоже, с регулярными выражениями не работает. Интересная функа, но, видимо, не для нашего случая
« Последнее редактирование: Ноябрь 12, 2018, 14:23:24 от musicstashall »

Оффлайн xXx [?]

  • Новичок
  • *
  • Сообщений: 42
  • Репутация: 11
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
но с другими уже не работает
Код: AutoIt [Выделить]
#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


Оффлайн musicstashall [?]

  • Новичок
  • *
  • Сообщений: 208

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
На офф сайте подсказали:

Код: AutoIt [Выделить]
#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
 



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

Русское сообщество AutoIt

Re: Получить путь к файлу из строки параметров
« Ответ #7 Отправлен: Ноябрь 12, 2018, 23:25:56 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
7212 Просмотров
Последний ответ Октябрь 18, 2010, 09:09:41
от AutoLove
15 Ответов
9052 Просмотров
Последний ответ Июль 26, 2011, 04:01:04
от AZJIO
10 Ответов
6900 Просмотров
Последний ответ Июль 22, 2011, 15:39:28
от CreatoR
2 Ответов
3449 Просмотров
Последний ответ Март 26, 2012, 15:56:05
от Dimmak
4 Ответов
2699 Просмотров
Последний ответ Октябрь 08, 2013, 18:47:05
от Montekristo
0 Ответов
1491 Просмотров
Последний ответ Октябрь 08, 2013, 18:05:38
от madmasles
6 Ответов
2147 Просмотров
Последний ответ Апрель 21, 2014, 09:09:46
от saraconor
4 Ответов
1450 Просмотров
Последний ответ Май 21, 2015, 00:01:39
от Tapok
1 Ответов
966 Просмотров
Последний ответ Сентябрь 30, 2016, 22:47:45
от Skif_off
1 Ответов
1327 Просмотров
Последний ответ Январь 21, 2018, 20:18:30
от sngr