Что нового

Вызов команд с внешнего файла или с переменной

eus_deus

Новичок
Сообщения
118
Репутация
0
Добрый вечер! Решение конечно дурацкое, но... чтобы не перекомпилировать самому ( а теща и компилировать не умеет), решил сделать так - основной файл будет выполнять команды с обычного текстового, который имеет структуру ini файла и считывается нужными секциями в двумерный массив, откуда выполняется
Например так
Код:
Func _execute_section($sOperName)
   $exec  = IniReadSection($ComFile,$sOperName)
   For $i = 1 To $exec[0][0]
     Execute($exec[$i][1])
   Next
EndFunc

Все бы вроде ничего, кроме двух аспектов.
1. Поначалу я долго мирился с тем, что команды надо помещать только в одну строку (может кто натолкнет на другой способ)
2. И с чем мирится нельзя - почему такая строка работает
Код:
1=DirCreate ("D:\Documents")

а вот такая нет
Код:
2=If Not FileExists("D:\Downloads\") Then DirCreate ("D:\Downloads")

Хотя если писать ее в скрипте в таком же виде, то она тоже исправно работает. Это как, типа условия не отработают, даже если писать в одну строку?
 

Skif_off

Знающий
Сообщения
173
Репутация
12
eus_deus
Обязательно нужно компилировать? Почему не взять AutoIt3.exe из дистрибутива, положить рядом ваш скрипт и создать рядом скрипт на VBScript, например, такого содержания
Код:
Dim sPath
Set objShellApp = CreateObject("Shell.Application")

sPath = Replace(WScript.ScriptFullName, "\" & WScript.ScriptName, "")

objShellApp.ShellExecute """" & sPath & "\AutoIt3.exe""", """" & sPath & "\ваш_скрипт.au3""", """" & sPath & "\test""", "", 1
?
vbs-файлы запускаются двойным кликом практически на любой ОС.
 
Автор
E

eus_deus

Новичок
Сообщения
118
Репутация
0
Dima1337 сказал(а):
По вашему, я это не читал? Написано же, что файл внешний имеет структуру ини-файла, и в разных местах считываются разные секции, то есть подключить второй скрипт не подходит.
VBS тоже не дело, во первых, я с ним не знаком, а во вторых, приплетать еще один язык не вижу смысла.
Весь вопрос в том, почему не работает строка через execute
Код:
If Not FileExists("D:\Downloads\") Then DirCreate ("D:\Downloads")

И в то же время нормально работает
Код:
DirCreate ("D:\Downloads")

И как в таком случае можно написать иначе? Если никак, то просто закроем тему
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
считывается нужными секциями в двумерный массив, откуда выполняется
Вам вставить операторы If EndIf что мешает?
Код:
;--- Бла бла всякий код
$i = 0

While 1
	;--- Бла бла всякий код
	If $i = 12 Then $pid = Run('AutoIt3.exe file.ini '&$i, '', @SW_HIDE)
	If $i = 20 Then $pid = Run('AutoIt3.exe file.ini Параметр=1', '', @SW_HIDE)
	If $i = 32 Then $pid = Run('AutoIt3.exe file.ini 01', '', @SW_HIDE)
	;--- Бла бла всякий код
	$i += 1
	If $i = 100 Then Exit
WEnd

И в файле file.ini
Код:
If $CmdLine[1] = '12' Then
	MsgBox(0,'','Вызвали сообщение под номером 12!!!!!!')
EndIf

If $CmdLine[1] = 'Параметр=1' Then
	MsgBox(0,'','Вызвали сообщение под номером 1!!!!!!')
EndIf

If $CmdLine[1] = '1' Then
	If Not FileExists("D:\Downloads\") Then DirCreate ("D:\Downloads")
EndIf


Все равно не пойму, если как вы выразились вам лень компилировать то какая разница какого расширения файл?
Вам либо прописывать каждую отдельную команду в основном скрипте меняя ее свойства через ini, либо запускать еще один скрипт...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
eus_deus [?]
И как в таком случае можно написать иначе?

23473.ini
INI:
[cd]
download=_CD('D:\Downloads')
files=_CD('D:\Files')

23473.au3
Код:
;~ $sOperName = "cd:files"
$sOperName = "cd:download"

_Execute_Section($sOperName)

Func _Execute_Section($sOperName)

   $a_Arg = StringSplit($sOperName, ":", 2)
   If @error Then _
	  Return SetError(1, 0, 0)

   $a_IRS = IniReadSection("23473.ini", $a_Arg[0])
   If @error Then _
	  Return SetError(2, 0, 0)

   For $i = 1 To $a_IRS[0][0]
	  If $a_Arg[1] ==  $a_IRS[$i][0] Then
		 $i_Ret = Execute($a_IRS[$i][1])
		 If @error Then _
			Return SetError(3, 0, 0)
		 If $i_Ret Then _
			Return SetError(0, 0, 1)
	  EndIf
   Next
   Return SetError(0, 0, -1)
EndFunc ;==>_Execute_Section


Func _CD($s_Path)
   If Not FileExists($s_Path) Then
	  DirCreate($s_Path)
	  Return 1
   EndIf
   Return 0
EndFunc ;==>_CD
 

sas2242

Новичок
Сообщения
38
Репутация
0
Здравствуйте. Подскажите пожалуйста, как правильно оформить...

Код:
Local $aKey[] = ['/A', '/B', '/C']
If $CmdLine[0] > 0 And $CmdLine[1] = $aKey Then

Чтобы если $CmdLine[1] равно один из ключей в массиве то выполняется определенный сценарий. Спасибо.
 

Andrey_A

Продвинутый
Сообщения
319
Репутация
68
как правильно оформить...
Можно так:
Код:
Local $aKey=['/A', '/B', '/C']
If $CmdLine[0]>0 Then
  Switch $CmdLine[1]
    Case $aKey[0]
      ; действие для /A
      MsgBox(4096,'/A',$aKey[0])
    Case $aKey[1]
      ; действие для /B
      MsgBox(4096,'/B',$aKey[1])
    Case $aKey[2]
      ; действие для /C
      MsgBox(4096,'/C',$aKey[2])
  EndSwitch
EndIf
 
Верх