Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Сценарии для Windows

Модерирует : KLASS, IFkO

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

Открыть новую тему     Написать ответ в эту тему

KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Старые и смежные темы: по CMD и в Программах | по PowerShell | В помощь системному администратору | Прикладное программирование

PowerShell
Версии | Ассоциация и подпись сценариев
Сценарий для ассоциации файлов PowerShell и запуска неподписанных скриптов.
 
Прочее
Расширение возможностей
Функции
Write-Color
Output-DebugString
Провайдеры
Готовые скрипты
Полезные ссылки | Будет ли репозиторий PowerShell на ru-board?
Книги в PDF
Cheat Sheets
 

Cmd
Для перекодирования кириллицы 866<—>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы
 
Готовые решения и частые вопросы
 
Описания работы команд и символов участниками темы:
setlocal enabledelayedexpansion и переменные окружения
символы & и && в командной строке
Переменная %0
 
Полезные ссылки и утилиты

WSH (VBScript, JScript)
Программирование "удобняшек" на VBScript

Примечания:
• Большие куски кода заключайте в тэг [ more ]
• Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте код без пробелов иначе сценарий может работать неправильно. Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
• Сторонние консольные утилиты можно использовать только в виде готового решения и только в рамках сценариев. Никаких обсуждений и обучений работе с утилитами не предусмотрено и прямо запрещено правилами топика.
Шапка и около-темные вопросы |

Всего записей: 11063 | Зарегистр. 12-10-2001 | Отправлено: 13:40 17-02-2018 | Исправлено: YuS 2, 08:24 19-06-2021
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, MH100181Q
Пока OLYMPUS Viewer 3 скачивается вопросы:
1. Почему UTF-8? Логичнее было бы CP866. Если русские символы в путях - не будет работать.
2. Где у Вас CmdBatch.exe относительно батника? Лучше первой строкой добавить переход в папку к батнику -
@cd /d "%~dp0"
3. После @call поставьте pause - выдаст ли какие-то сообщения о ошибках.
4. Есть ли в системе choice?
5. Образец файла для конвертации и оригинал батника можно где-то выложить?

Всего записей: 1883 | Зарегистр. 07-08-2002 | Отправлено: 22:04 18-03-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
m00slim25
А если к вызову PS добавить -ExecutionPolicy ByPass

Код:
@powershell -ExecutionPolicy ByPass -NoProfile -NoLogo -Command "iex (${%~f0} | out-string)" &exit/b

?

----------
Разум когда-нибудь победит

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 22:18 18-03-2019
MH100181Q



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alex_Piggy
 

Цитата:
1. Почему UTF-8? Логичнее было бы CP866.

Принято.

Цитата:
2. Где у Вас CmdBatch.exe относительно батника?

В той-же директории

Цитата:
3. После @call поставьте pause - выдаст ли какие-то сообщения о ошибках.  

делал, но если совсем накосячишь, окошко схлопнется всё-равно

Цитата:
4. Есть ли в системе choice?  

Знать бы что это. СтоИт вин 10 x64

Цитата:
5. Образец файла для конвертации и оригинал батника можно где-то выложить?

Образец файла в дистрибутиве что вы скачиваете.
Оригинал не знаю откуда взял человек, с форума:

Код:
 
@SET ViewerPath=C:\Program Files (x86)\OLYMPUS\OLYMPUS Viewer 3\
 
@IF "%~1"=="" (@SET OrfPath=*.ORF) ELSE (@SET OrfPath=%1%)
@IF "%~2"=="" (@SET TifPath=%CD%) ELSE (@SET TifPath=%2%)
 
@echo off
@rem
@FOR %%f in (%OrfPath%) DO (
@rem
@echo ^<?xml version=^"1.0^" encoding=^"UTF-8^"?^>               > ini.tmp
@echo ^<PrivateIni^>                                             >> ini.tmp
@echo ^<BatchSetting^>                                         >> ini.tmp
@echo  ^<FormatID^>65537^</FormatID^>                   >> ini.tmp
@echo  ^<Quality^>0^</Quality^>                         >> ini.tmp
@echo  ^<Resolution^>0^</Resolution^>                   >> ini.tmp
@echo  ^<ResolutionUnit^>0^</ResolutionUnit^>           >> ini.tmp
@echo  ^<BitPerChannel^>16^</BitPerChannel^>            >> ini.tmp
@echo  ^<CreateDateMode^>0^</CreateDateMode^>           >> ini.tmp
@echo  ^<SubSampling^>1^</SubSampling^>                 >> ini.tmp
@echo  ^<AppName^>OLYMPUS Viewer 3 1.5W^</AppName^>     >> ini.tmp
@echo  ^<InheritFocusPoint^>1^</InheritFocusPoint^>     >> ini.tmp
@echo  ^<SrcFile^>%%~dpnxf^</SrcFile^>                  >> ini.tmp
@echo  ^<DstFile^>%TifPath%\%%~nf.tif^</DstFile^>       >> ini.tmp
@echo  ^<Result^>0^</Result^>                           >> ini.tmp
@echo    ^</BatchSetting^>                                       >> ini.tmp
@echo ^</PrivateIni^>                                            >> ini.tmp
 
 
@call "%ViewerPath%CmdBatch.exe" /ini:ini.tmp
 
)
 

Всего записей: 1421 | Зарегистр. 29-04-2008 | Отправлено: 22:19 18-03-2019 | Исправлено: MH100181Q, 22:20 18-03-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
LevT

Цитата:
Многострочный комментарий на powershell не является таковым для cmd

Естественно

Цитата:
А вот что Вы хотите ей сказать закорючкою

cmd /? в помощь (Вы называете это потыкать палочкой. Вот и потыкайте).
 
А вообще там:
- выводится содержимое скрипта ${%~f0}
- вывод идёт в Out-String
- результат обрабатывается Invoke-Expression
- здесь должен быть profit
 
Можете записать это в виде -Command "${%~f0} | Out-String | Invoke-Expression" будет Ваш любимый кошерный вариант с монадами


----------
Разум когда-нибудь победит

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 22:34 18-03-2019 | Исправлено: Smitis, 22:37 18-03-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis

Цитата:
cmd /? в помощь

 
Хотя эта закорючка понятна cmd.exe (его интерпретатору батников), для powershell.exe (интерпретатора его языка сценариев) она не имеет смысла
 
 

Цитата:
А вообще там:

Без доступа к намерениям написавшего, я бы не пытался интерпретировать столь могучее вуду с вызовами cmd из powershell, который вызывается из cmd и наоборот.
 
Оттого я и попросил спросившего предоставить отчёт о том, что именно он собрался скормить которому из двух интерпретаторов.
Но человеку требуются телепаты...

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 22:48 18-03-2019 | Исправлено: LevT, 23:01 18-03-2019
m00slim25



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
Всё, я разобрался. В пути к файлу была папка, имя которой заключено в квадратные скобки []. Powershell'у это явно не по вкусу. Спасибо за участие!

Всего записей: 1039 | Зарегистр. 30-05-2006 | Отправлено: 03:15 19-03-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
m00slim25

Цитата:
Запускается .cmd в консоли, передаёт управление в powershell, в котором должен распаковаться зашифрованный в теле .cmd файл msvcp120.dll.

Понятно. Про кодировку файла я не случайно спросил выше.
Вот тестовый файл гибрида, в Вашем варианте:

Код:
<# :
@echo Кириллица криво отобразится, если кодировка файла не 866
@echo Но если кодировка файла 866, то скрипт powershell не сработает
 
powershell -c "iex (${%~f0} | out-string)" &pause&exit /b
#>  
$f= 'TEST string - Тестовая строка для powershell'
$f

- это не совсем удачный вариант запуска комбинированного скрипта, т.к. не учитывает кодировку файла. Если в коде самого батника где-то используется кириллица, то проблематично будет с этим бороться... Кроме того, powershell не любит пути с квадратными скобками и в этом варианте, тоже обойти этот момент проблематично...
 
В общем, вот такой вариант лишен этих недостатков:

Код:
<# ::
@echo off
echo Кириллица криво отобразится, если кодировка файла не 866
echo Но скрипт powershell отработает верно, в том числе и с кодировками,  
echo если правильно указать кодировку файла командлету get-content
 
powershell -ex bypass -c "&{[scriptblock]::create((gc -lit '%~f0' -enc OEM) -join [char]10).invoke()}"
pause&exit /b
#>
$a,$b='Привет мир!','И вам не кашлять!'
$a;$b

 
Добавлено:
m00slim25

Цитата:
имя которой заключено в квадратные скобки []. Powershell'у это явно не по вкусу.

Вот! Вы уже с этим столкнулись  
 
Добавлено:
Smitis

Цитата:
А если к вызову PS добавить -ExecutionPolicy ByPass

Вроде бы, это исключение должно возникать ранее, чем ошибка в самом скрипте...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 08:55 19-03-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
YuS_2

Цитата:
Вроде бы, это исключение должно возникать ранее, чем ошибка в самом скрипте...

Согласен

Цитата:
powershell -ex bypass -c "&{[scriptblock]::create((gc -lit '%~f0' -enc OEM) -join [char]10).invoke()}"

А если в пути к файлу будет апостроф?
Имхо, самый безопасный способ это передать имя файла через переменную среды

Код:
<# ::
@echo off
chcp 65001 >nul
set "PSCommandPath=%~f0"
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -nol -nop -exe bypass -c "&{[ScriptBlock]::Create((gc -lit $env:PSCommandPath -enc 'UTF8') -join [Char]10).Invoke()}"
exit /b
#>

И сохранять всё в UTF8 без BOM

Цитата:
Кроме того, powershell не любит пути с квадратными скобками и в этом варианте, тоже обойти этот момент проблематично...

А самое гадкое, что эта падла в этом случае даже если и запустится с LiteralPath, текущей директорией делает либо $PSHome либо корень диска.
 


----------
Разум когда-нибудь победит

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 09:53 19-03-2019 | Исправлено: Smitis, 09:54 19-03-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis

Цитата:
А если в пути к файлу будет апостроф?

У меня выполняется без запинки, если в самом коде апострофы поменять на утроенные двойные кавычки:

Код:
powershell -ex bypass -c "&{[scriptblock]::create((gc -lit """%~f0""" -enc OEM) -join [char]10).invoke()}"

 

Цитата:
Имхо, самый безопасный способ это передать имя файла через переменную среды

или так... тоже вполне рабочий вариант.
 

Цитата:
И сохранять всё в UTF8 без BOM

Ну, это необязательно... нормально работает и с другими кодировками:

Код:
<# ::  
@echo off
>nul chcp 1251
echo Кириллица криво отобразится, если кодировка файла не совпадает с текущей кодовой страницей
echo Но скрипт powershell отработает верно, в том числе и с кодировками, если правильно  
echo указать кодировку файла командлету get-content  
echo "%~0"
echo ===
set "var=%~f0"
powershell -ex bypass -c "&{[scriptblock]::create((gc -lit $env:var -enc default) -join [char]10).invoke()}"  
pause&exit /b  
#>  
$a,$b='Привет мир!','И вам не кашлять!'  
$a;$b

 

Цитата:
А самое гадкое, что эта падла в этом случае даже если и запустится с LiteralPath, текущей директорией делает либо $PSHome либо корень диска.

Это да, зараза та ещё... ни кавычки, ни переменная среды не помогают. Причем на изменение текущего каталога влияют именно квадратные скобки...
 
Добавлено:
Но можно в самом скрипте попытаться это предусмотреть:

Код:
<# ::  
@echo off
>nul chcp 1251
echo Кириллица криво отобразится, если кодировка файла не совпадает с текущей кодовой страницей
echo Но скрипт powershell отработает верно, в том числе и с кодировками, если правильно  
echo указать кодировку файла командлету get-content  
echo "%~0"
echo ===
set "var=%~f0"
powershell -ex bypass -c "&{[scriptblock]::create((gc -lit $env:var -enc default) -join [char]10).invoke()}"  
pause&exit /b  
#>
sl -lit $(split-path $env:var)
gl
$a,$b='Привет мир!','И вам не кашлять!'  
$a;$b

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 11:26 19-03-2019 | Исправлено: YuS_2, 11:47 19-03-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
YuS_2

Цитата:
Но можно в самом скрипте попытаться это предусмотреть

Можно опять через переменные среды.
В cmd части set "PSCurrentDir=%CD%"
В ps части SetLocation -lit $env:PSCurrentDir

Цитата:
У меня выполняется без запинки, если в самом коде апострофы поменять на утроенные двойные кавычки:

Хм... Посмотрю.
Тут проблема в чём, Пошик НЕ УМЕЕТ разбирать командную строку САМ (индусы "ниасилили"). Для разбора используется стандартный код, разбивающий строку на параметры.
Поясню. Как сделать обработку -command? Логика подсказывает, получаем всю командную строку (на дотнет это System.Environment.CommandLine). Разбираем параметры, так, как это делает система, встретив -command меняем способ парсинга, так как далее код на PS. Как сделали индусы - получают список параметров System.Environment.GetCommandLineArgs(), обрабатывают их в цикле, встретив -command склеивают из оставшихся параметров блок для выполнения. Отсюда вся эта чехарда с кавычками при передаче блока (а в гибридных файлах ещё и cmd со своим разбором подключается, в cmd, кстати, разбор параметров более нормальный).
Пример

Код:
powershell.exe -nol -nop -exe bypass -noexit -c &{echo "Press any key . . .";while($k.VirtualKeyCode -eq $Null){$k=$Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')}}

Запускать через Win+R. Видно, что парсер кавычки потерял.

----------
Разум когда-нибудь победит

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 12:51 19-03-2019 | Исправлено: Smitis, 13:07 19-03-2019
m00slim25



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Цитата:
В общем, вот такой вариант лишен этих недостатков:

Smitis
Цитата:
А если в пути к файлу будет апостроф?  
Имхо, самый безопасный способ это передать имя файла через переменную среды

Спасибо, очень ценные заметки, беру «на вооружение»!
 
YuS_2
Цитата:
или так... тоже вполне рабочий вариант

Цитата:
Кроме того, powershell не любит пути с квадратными скобками и в этом варианте, тоже обойти этот момент проблематично

.cmd-файл(ы) упаковать в ещё более крупный монолитный контейнер, из него извлечь в %Temp%[\subdir], и уже оттуда запускать. Как должно быть понятно из контекста сам(и) .cmd-файл(ы) временный(е) - распаковать его(их) содержимое, и удалить .cmd-файл(ы)

Всего записей: 1039 | Зарегистр. 30-05-2006 | Отправлено: 14:11 19-03-2019 | Исправлено: m00slim25, 14:20 19-03-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
m00slim25
Проще тоже через переменную среды.
А ещё надо параметры передать :)
Вот пример заготовки гибридного файла, с передачей всего через переменные. Параметры разбираются прямо в коде. Параметры передаются не как принято в PS, а как принято в WSH и разных утилитах, есть именованные, передаваемые в виде /key или /key2:value и неименнованные (без /). Параметры помещаются в $args. Неименованные под номерами, $args[0], $args[1] и т.д., счётчик в $args._Count. Именнованные как пары хеш-значение $args.key, $args.key2. Если есть значение типа /k:val, то значение в хеше строка, если нет значения /k - булево значение $true. По умолчанию используется кодировка UTF8 без BOM.

Код:
<# : Сохранять в UTF8 без BOM с расширением .CMD
@echo off
chcp 65001 >nul
set "PSCommandPath=%~f0"
set "PSScriptRoot=%~dp0"
set "PSCommandLine=%*"
set "PSCurrentDir=%CD%"
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -nol -nop -exe unrestricted -c "&{[ScriptBlock]::Create((gc -lit $env:PSCommandPath -enc 'UTF8') -join [Char]10).Invoke()}"
exit /b
#>
$PSCommandPath=$env:PSCommandPath;$PSScriptRoot=$env:PSScriptRoot;$args=&{$r=@{_Count=0};$s=$env:PSCommandLine;$i=0;$q=$false;$a=$null;if($s){do{$c=$s[$i++];if($c-eq'"'){$q=-not $q}elseif($c-and($q-or" ","`t"-notcontains$c)){$a+=$c}elseif($a){if($a[0]-ne"/"){$r[$r._Count++]=$a}elseif($a-match"/(.+?):(.+)"){$r[$matches[1]]=$matches[2]}else{$r[$a.Substring(1)]=$true}$a=$null}}while($c)}return $r}
Set-Location -LiteralPath $env:PSCurrentDir
"------------------------------------------------------------"
[System.Environment]::GetCommandLineArgs()
"------------------------------------------------------------"
"Arguments:"
$args
"------------------------------------------------------------"



----------
Разум когда-нибудь победит

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 14:38 19-03-2019 | Исправлено: Smitis, 14:39 19-03-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis

Цитата:
Тут проблема в чём, Пошик НЕ УМЕЕТ разбирать командную строку САМ (индусы "ниасилили").

 
Тут проблема в том, что он и не обещал такого
powershell вызываемый из батника - обычный процесс, управление его запуском осуществляется извне согласно контракту
смотри powershell /?
-Command должен быть последним параметром (в одной из трёх разновидностей)
Содержимое его интерпретируется согласно тому же опубликованному контракту.
 
Есть ещё нормальный вариант, для неиспорченных вудуизмом мозгов:
писать сценарии на одном каком-нибудь языке, а не на смеси французского с нижегородским.
 
А если КРАЙНЕ нужно призвать посторонний движок - понимать, что при этом происходит обычный старт процесса с теми параметрами, которые ему дадены.

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 14:38 19-03-2019 | Исправлено: LevT, 14:49 19-03-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
LevT

Цитата:
Тут проблема в том, что он и не обещал такого

Как это не обещал, а как же

Цитата:
-Command должен быть последним параметром (в одной из трёх разновидностей)

То, что он последний в строке, это правильно. В cmd так же. Но почему, если он последний в строке и всё после него это уже, можно сказать один параметр, неделимый (в моём примере), он разбирается так, как будто это обычные параметры? А потом из этих параметров лепится обратно в целое, но уже не так как задумано?

Цитата:
Есть ещё нормальный вариант, для неиспорченных вудуизмом мозгов:

Есть ещё варианты, рассказываю специально для тех, у кого портить нечего - powershell.exe может быть запущен из другого приложения. Не обязательно из cmd. Вариант прамо на слуху - из планировщика. Или прямо из ярлыка. И т.п.
 


----------
Разум когда-нибудь победит

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 14:47 19-03-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis

Цитата:
 
-Command
    Executes the specified commands (and any parameters) as though they were
    typed at the Windows PowerShell command prompt, and then exits, unless
    NoExit is specified. The value of Command can be "-", a string. or a
    script block.
 
    If the value of Command is "-", the command text is read from standard
    input.
 
    If the value of Command is a script block, the script block must be enclosed
    in braces ({}). You can specify a script block only when running PowerShell.
    in Windows PowerShell. The results of the script block are returned to the
    parent shell as deserialized XML objects, not live objects.
 
    If the value of Command is a string, Command must be the last parameter
    in the command , because any characters typed after the command are
    interpreted as the command arguments.
 
    To write a string that runs a Windows PowerShell command, use the format:
        "& {<command>}"
    where the quotation marks indicate a string and the invoke operator (&)
    causes the command to be executed.
 

 
Добавлено:
Вы утверждаете, что этот контракт "индусы" нарушили?

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 14:51 19-03-2019 | Исправлено: LevT, 14:53 19-03-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
LevT

Цитата:
If the value of Command is a script block, the script block must be enclosed
    in braces ({}).

Если это скрипт-блок, написанный в соответствии с синтаксисом PS, цельный, неделимый, зачем его распиливать на кусочки средствами ОС (которая парсит его не так, как это делал бы парсер PS), а потом склеивать его обратно?
 
 
Добавлено:
И да, это нарушение контракта, я передаю скрипт-блок, а мне его превращают в нерабочую конструкцию (в своём примере я специально избегал возникновения ошибок, легко можно модифицировать, когда правильный скрипт-блок не будет обработан).

----------
Разум когда-нибудь победит

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 15:06 19-03-2019 | Исправлено: Smitis, 15:07 19-03-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
 
Не могу понять, что Вас не устраивает.
Можете привести пример запуска из планировщика?  
 
По-моему, там всё логично
 

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 15:18 19-03-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
LevT

Цитата:
Не могу понять, что Вас не устраивает.

Я привёл пример, в котором скрипт-блок работает не так, как задумано по причине банальной халатности индусов, которым вундервафли писать интересней, чем отлаживать мелкие недочёты. Это не баг, правильно, никто не обещал, что это будет ПРАВИЛЬНО работать. Как-то работает и ладно.
 
Добавлено:

Цитата:
Можете привести пример запуска из планировщика?

Действие: Запуск программы
Программа или сценарий: powershell.exe
Аргументы: -nol -nop -exe unrestricted -noexit -c &{echo "Press any key . . .";while($k.VirtualKeyCode -eq $Null){$k=$Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')}}


----------
Разум когда-нибудь победит

Всего записей: 3179 | Зарегистр. 09-02-2003 | Отправлено: 15:27 19-03-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
 
1) Сознаёте ли Вы, что не следуете контракту - и хотите чтобы то ли по Вашему, то ли по щучьему веленью повершел догадался о Ваших пожеланиях?
 
2) Вы сознательно вызываете повершел без обычного контекста, который он предоставляет своим скриптам - и при этом хотите, чтобы в Вашем распоряжении был аж целый $host
 
сравните:
PS > powershell -nol -nop -exe unrestricted -noexit -c "&{$psversiontable}"    #запуск строки
System.Collections.Hashtable : The term 'System.Collections.Hashtable' is not recognized as the name of a cmdlet,
function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.
At line:1 char:3
+ &{System.Collections.Hashtable}
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (System.Collections.Hashtable:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
 
PS PS> powershell -nop -nol -exe unrestricted -noexit -c ({$psversiontable})     #запуск скриптблока
 
Name                           Value
----                           -----
PSVersion                      5.1.17763.134
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17763.134
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
 
А вот $host не инициализируется и в этом случае
 
Хотите, чтобы он присутствовал в контексте - запускайте повершел сценарии из программы, которая реализует для них этот интерфейс (то есть powershell.exe или ISE или например VSCode).

Всего записей: 17126 | Зарегистр. 14-10-2001 | Отправлено: 16:22 19-03-2019 | Исправлено: LevT, 16:27 19-03-2019
Falcon99



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть вопрос. Сейчас у нас производится сканирование комплектов документов. В каждом случае получается два файла текстовая часть (pdf) и графическая часть (tif). Сканируют 3 человека и кладут в соответствующие папки на удаленном компьютере. В результате на нём файлы распределяются следующим образом:

Код:
Обмен\Документы\*.pdf
Обмен\Документы\Формат\*.tif  
Обмен\Документы\Неформат\*.tif

Т.е. графические файлы складываются в один из двух каталога в зависимости от размера отсканированной графики.
Текстовая часть же складывается в корень.
Формат имени для графики и текстовой части отличаются, но имеют похожие части:
Текстовая часть имеет вид:

Код:
XXXX_111111-222222.pdf

Графическая часть:

Код:
XXXX_* - 111111-222222.tif

"XXXX_" - от файла к файлу не меняется.
"*" - меняется от файла к файлу и имеет переменную длину.
"111111" - цифровая часть, также не меняется для всех файлов.
"222222" - цифровая часть, которая меняется от комплекта файлов к комплекту.
Иногда какой либо файл был не отсканирован или не скинут, определяем по тому что число файлов текстовой части не равно числу файлов графики. И тогда приходится искать какой файл отсутствует. Делается это вручную, что весьма не удобно. Для этого делаются два текстовых файла. В одном копируются названия всех текстовых фалов, без расширения. Во втором список графических файлов без расширения, потом стирается все что до цифровой части. Т.е. в результате в обоих файлах остается только  часть "111111-222222". Делаю сортировку строк, в обоих файлах. После этого используется программа для сравнения файлов по содержимому, аналогичная WinMerge. В результате ищется строчка которая имеется только в одном из файлов.  
Можно ли автоматизировать этот процесс? Т.е. проверять есть пара для каждого тестового файла и если отсутствует, то создать текстовый файл со списком какой файл без пары? Идеально если бы рассматривалась и ситуация когда не хватает и текстового файла, т.е. графика есть, а текстовой части нет, а также проверка наличия дублирующихся строк.
 
P.s. Скрипт желателен ввиде bat файла, т.к. дальше производится обработка файла также с помощью bat файла.

Всего записей: 607 | Зарегистр. 12-10-2005 | Отправлено: 16:47 19-03-2019 | Исправлено: Falcon99, 17:34 19-03-2019
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Сценарии для Windows


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru