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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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.
• Сторонние консольные утилиты можно использовать только в виде готового решения и только в рамках сценариев. Никаких обсуждений и обучений работе с утилитами не предусмотрено и прямо запрещено правилами топика.
Шапка и около-темные вопросы |

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



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

Цитата:
Сознаёте ли Вы, что не следуете контракту

Обоснуйте

Цитата:
Вы сознательно вызываете повершел без обычного контекста, который он предоставляет своим скриптам - и при этом хотите, чтобы в Вашем распоряжении был аж целый $host

Где Вы увидели, что я запускаю скрипт (под скриптом я понимаю скрипт в отдельном файле)? Или Вы считаете неправомерным использование powershell.exe с -command? Это тоже китаец в фильме рассказал, что нельзя так PS использовать? Или кто? Где я говорил, что что-то не так с $host? В чего Вы взяли, что там что-то не так с $host?

Цитата:
сравните:

Что Вы пытаетесь доказать? Что не все автоматические переменные определены при выполнении таким образом? Здрасьте, приехали. Открыли Америку.

Цитата:
Хотите, чтобы он присутствовал в контексте

Не требую ничего несуществующего в контекст. Вывод в консоль и так работает, а другого там нет. Как говориться, сами придумали, сами же и разоблачили.
 


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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
уважаемый камрад, я хотел обратиться лично к вам, вы уже неоднократно помогали мне с батниками и запомнились как весьма адекватный, компетентный и отзывчивый человек, пищущий по делу и не тролящий собеседников из за незнания основ.
---
вобщем как я уже писал в этой теме, мне попался скрипт удаления onedrive из десятых окон.
я протестировал его на ряде виртуалок, в принципе он работает как надо несмотря на свою старость.
есть только одно пожелание, как бы еще добавить ему в в список удаления, папку onedrive (c содержимым), которая остаётся в каталоге текущего пользователя?
 
данная папка и файлы ничем не блокируется, можно прямо сразу удалять по shift+del, но это лишнее телодвижение, которое я хотел бы убрать.
 
в тотал коммандер (а точнее в самих окнах) есть прекрасная система переменных среды, в которой папка текущего юзера находится например вот так: cd %USERPROFILE%
то что надо удалить находитя здесь: %USERPROFILE%\AppData\Local\onedrive\
 
листинг скрипта для правки (залил на пастебин, во избежании порчи и автозамены его символов форумом) https://pastebin.com/Urf00p1m
 
заранее благодарю!

----------
animelist

Всего записей: 7413 | Зарегистр. 11-03-2004 | Отправлено: 17:11 19-03-2019 | Исправлено: AngelNet, 17:13 19-03-2019
Smitis



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

Цитата:
"*" - меняется от файла к файлу и имеет переменную длину.

Содержит ли эта часть символ "-" (минус)? (Если нет, проще будет поделить имя файла на части)


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

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



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

Цитата:
Обоснуйте  
 

 
Я обосновал: согласно тексту хелпа поправил Ваш вызов в обе стороны - и для запуска "строки", и для запуска "скриптблока"
Ваша исходная строка ни туда и ни сюда.

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



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

Код:
rm -Recurse -Force -ErrorAction SilentlyContinue "$env:USERPROFILE\AppData\Local\onedrive"

Необычно смотрится такой код для PS в стиле cmd =)

Всего записей: 1390 | Зарегистр. 12-12-2006 | Отправлено: 17:31 19-03-2019
Smitis



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

Цитата:
Ваша исходная строка ни туда и ни сюда.

А куда? Утверждаете, что скрипт-блок нарушает синтаксис PS? Такие строки запрещены к использованию? Что конкретно не так в строке? Каким боком это всё связано с $host?


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

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



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

Цитата:
Содержит ли эта часть символ "-" (минус)? (Если нет, проще будет поделить имя файла на части)  

Название графических файлов всегда оканчивается на " - 111111-222222.tif", у pdf файлов "_111111-222222.pdf"

Всего записей: 607 | Зарегистр. 12-10-2005 | Отправлено: 17:40 19-03-2019 | Исправлено: Falcon99, 17:46 19-03-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Falcon99
Лучше озвучте, что там вообще может быть, пробелы, например и пр.
Для чего это надо - разделить через for имя на части, собрать маску и проверить существование пар в папках формат/неформат через if exist
Лучше всего примеры файлов (чем сложнее имя, тем лучше)


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

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
Прошу прощения, не правильно маску указал: "11111111-2222".
Лучше наверно выделять из названия файлов, без учета расширения, последние 13 символов и сравнивать их. Потому что именно эта часть для пар файлов общая.  
 
P.s. В той части где символ "*" может быть что угодно из разрешенных символов к использованию в названии файла, т.е. и пробелы, и числа, и скобки, и даже символы нижнего подчеркивания, т.к. увы это стандартизовать не возможно.

Всего записей: 607 | Зарегистр. 12-10-2005 | Отправлено: 17:50 19-03-2019 | Исправлено: Falcon99, 17:52 19-03-2019
LevT



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

Цитата:
Утверждаете, что скрипт-блок нарушает синтаксис PS? Т

 
То, что Вами написано - является скриптблоком только в Вашем сознании.
 
Оно не отвечает спецификации ни -Command <string>, ни -Command <script-block>
Обе описаны в выдаче powershell /? , которую я процитировал выше
 
 
Добавлено:
westlife
 
Да нормальная строчка. бывает и хуже пишут
Разве что я бы использовал именованный параметр -Path или передавал бы путь по трубе

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
В качестве примера названия файлов.
Например нечто вроде:
"ПГУ_45673210-2345.pdf"
"ПГУ_Малая Темерязевка, № 32_54, (по левой стороне), (Номер 453_34_234) - 45673210-2345.tif"
Название файлов абсолютно вымышленное, но структурно соответствует.

Всего записей: 607 | Зарегистр. 12-10-2005 | Отправлено: 17:57 19-03-2019 | Исправлено: Falcon99, 17:59 19-03-2019
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Falcon99
Ну, если последние 13 символов, то всё проще

Код:
@echo off
setlocal enabledelayedexpansion enableextensions
cd /d "%~dp0Обмен\Документы"
for %%a in ( *.pdf ) do (
    set "name=%%~na"
    if not exist "Неформат\*!name:~-13!.tif" if not exist "Формат\*!name:~-13!.tif" echo %%~nxa
)

В кодировке 866.
Выведет имена pdf без пары.
 
Добавлено:
LevT
Я понял, Вы считает, что команда, скажем

Код:
-command "&" {echo "TEST  TEST  TEST"}

противоречит хелпу (привожу русскую версию)

Цитата:
Если значением Command является строка, параметр Command должен быть последним в команде, поскольку любой знак, введенный после него, интерпретируется как аргумент команды.

потому как далее идёт

Цитата:
При написании строки команды Windows PowerShell используйте следующий формат: "& {<команда>}", где кавычки отделяют строку, а оператор вызова (&) запускает выполнение команды.

Но если строка в кавычках это "&" то должна быть выдана ошибка, отсутствие аргумента для &, лишний аргумент в командной строке или что-то подобное. Но такого нет.
Более того, вот такая строка выполняется нормально, хотя никакому синтаксису не соответствует

Код:
-command "& {echo """TEST  TEST  TEST"""}"

или так

Код:
-command & {echo """TEST  TEST  TEST"""}



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

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



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
Да, они могли бы возвращать ошибки на неправильный синтаксис, но этого не делают.
 
Есть основания считать, что в планах было сделать этот синтаксис правильным (нагрузив смыслом &, который сейчас "зарезервирован")

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



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

Цитата:
Есть основания считать, что в планах было сделать этот синтаксис правильным (нагрузив смыслом &, который сейчас "зарезервирован")

Я про это уже две страницы толкую. За 15 лет не смогли сделать нормальный парсер командной строки. Всего-то надо было взять строку, не разбитую на параметры, со всеми кавычками, пробелами и пр. и всё, что после -command тупо передать на выполнение.


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

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



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

Цитата:
 Всего-то надо было взять строку, не разбитую на параметры, со всеми кавычками, пробелами и пр. и всё, что после -command тупо передать на выполнение.  
 

 
Вот этого вот нам ненадоть!
Они видимо хотели что-то ещё "монадическое" туда впихнуть - но внезапно развитие Windows Powershell прекратилось...
 
Интересно, что там в pwsh?
(прям щас недосуг посмотреть, извините)

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



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

Цитата:
Они видимо хотели что-то ещё "монадическое" туда впихнуть

Пятнадцать лет хотели?
С такой скоростью любое событие будет "внезапным".


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

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



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

Цитата:
в тотал коммандер (а точнее в самих окнах) есть прекрасная система переменных среды, в которой папка текущего юзера находится например вот так: cd %USERPROFILE%

Всё дело в том, что в powershell такая переменная указывает не профайл авторизованного пользователя, а профайл пользователя, от имени которого выполняется скрипт...

Цитата:
есть только одно пожелание, как бы еще добавить ему в в список удаления, папку onedrive (c содержимым), которая остаётся в каталоге текущего пользователя?

Так вот же подсказка:
 18-03-2019
Если я правильно понял, то iNNOKENTIY21, как раз и спрашивал про текущего пользователя, вошедшего в систему, а не админа, от имени которого выполняется скрипт... наверное, он сейчас, как раз и занимается подобным скриптом...
 18-03-2019
Но если нет, то, для удаления содержимого вместе с каталогом onedrive, надо смотреть в сторону каталога профайла текущего пользователя (опять таки не админа, от имени которого скрипт выполняется), примерно так:

Код:
pushd
sl 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'  
$loginuser = (gcim win32_computersystem|select username).username|split-path -leaf  
$loguserprof = (gp (dir).pschildname |? profileimagepath -match "\\$loginuser$").profileimagepath
popd

 
т.е. добавив эти строки, например в начало скрипта, надо вместо этой строки:

Код:
rm -Recurse -Force -ErrorAction SilentlyContinue "$env:localappdata\Microsoft\OneDrive"

записать такую:

Код:
rm -Recurse -Force -ErrorAction SilentlyContinue "$loguserprof\AppData\Local\Microsoft\OneDrive"

а если проводить аналогию этой строки:
 19-03-2019
 

Цитата:
%USERPROFILE%\AppData\Local\onedrive\

то она будет такой:

Код:
"$loguserprof\AppData\Local\onedrive"

 
При этом, не берусь анализировать весь скрипт целиком, т.к. проверять не на чем, у меня OneDrive отсутствует...  
В общем, прежде чем запускать на живой системе, протестируйте на виртуалках.

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
вас не затруднит выложить уже исправленный вариант на любой текстохостинг? (ту же пастебину).
что то я боюсь сам в эту кашу вносить правки.
виртуалку уже приготовил к бою.
---
как можно вывести результат работы скрипта в текстовый файл?
там что то совсем всё плохо и много красного текста в логе промелькивает. хотелось бы изучить.


----------
animelist

Всего записей: 7413 | Зарегистр. 11-03-2004 | Отправлено: 21:36 19-03-2019 | Исправлено: AngelNet, 00:24 20-03-2019
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
 
Покрутил варианты параметров запуска powershell
со своим пейлоадом ($host)  
-noexit убрал
 
 
Результаты:
 

Код:

C:\>powershell -nol -nop -exe unrestricted -c "& $host"
& : The term 'System.Management.Automation.Internal.Host.InternalHost' 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
+ & $host
+   ~~~~~
    + CategoryInfo          : ObjectNotFound: (System.Manageme...st.InternalHost:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

 
то есть, при запуске -Command <string>  
окружение повершел не инициализируется
 

Код:

C:\>powershell -nol -nop -exe unrestricted -c ({$host})
$host

 
то есть запуск -Command <script-block> не работает из CMD.
Но он и не должен оттуда работать: судя по спецификации powershell /? он работает только из powershell
 

Код:

C:\>powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
 
PS C:\> powershell -nol -nop -exe unrestricted -c ({$host})
 
 
Name             : ConsoleHost
Version          : 5.1.17763.134
InstanceId       : d6a7f671-0afd-493b-bf5b-a9f4ff6bba9e
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : en-US
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace
 
PS C:\>

 
А вот из powershell -Command <script-block> запускается, ему доступно уже инициализированное окружение.
 
Добавлено:
Теперь можете добавить всюду любимый -noexit и понять, где чьи тапки
 
 
Добавлено:
 
Выводы таковы:  
1) Полноценный запуск скриптблока powershell  из cmd и всего остального возможен только если тот сохранён на диск в скрипт (с параметром -File и прочими настраиваемыми здесь параметрами специфичного powershell окружения)
 
2) Возможен запуск на исполнение "строки", но не следует обижаться на недоступность привычного в консоли повершел окружения.
 
3) Скриптблок можно зарядить на исполнение из powershell новому экземпляру этого процесса - и даже получить оттуда десериализованные объекты.

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



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

Цитата:
Если я правильно понял, то iNNOKENTIY21, как раз и спрашивал про текущего пользователя, вошедшего в систему, а не админа, от имени которого выполняется скрипт... наверное, он сейчас, как раз и занимается подобным скриптом...  

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

Код:
 
$LoginUserName = (Get-CimInstance Win32_ComputerSystem).UserName | Split-Path -leaf
$LoginUserSID = (([System.Security.Principal.NTAccount]$LoginUserName).Translate([System.Security.Principal.SecurityIdentifier])).Value
$ProfileList = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$LoginUserSID"
$LoginUserProfile = (Get-ItemProperty -Path $ProfileList).ProfileImagePath
 
$LoginUserName
$LoginUserSID
$LoginUserProfile
 

 

Всего записей: 1390 | Зарегистр. 12-12-2006 | Отправлено: 23:03 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