Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Проверить процесс, создать папку "AT-1" в папке "AT" и вместе с ее файлами и папками (http://forum.oszone.net/showthread.php?t=345737)

KOD65001 04-07-2020 14:22 2927195

Проверить процесс, создать папку "AT-1" в папке "AT" и вместе с ее файлами и папками
 
Есть папка "AT" с постоянным именем, полный путь C:\AT

Есть папка "M" тоже с постоянным именем, полный путь C:\M

В папке "M" есть еще папка с файлами и подпапками. Имя папки, которая лежит в папке "M" всегда разное
и может принимать вид, например такой: "Блок © VF 办公室"

Нужно чтобы при запуске BAT скрипта выполнялась проверка процесса "calc.exe"


1) Если процесс "calc.exe" есть, то

Ожидать когда процесс "calc.exe" завершится, чтобы выполнить пункт (2)


2) Если процесса "calc.exe" нету, то

создать папку "AT-1" в папке "AT" и всю папку "Блок © VF 办公室" вместе с ее файлами и подпапками переместить в созданную папку "AT-1", но
только в том случае если в папке "AT" нету папки "AT-1", а если папка "AT-1" уже есть, то создать папку "AT-2" и переместить туда!
затем закрыть BAT скрипт.

P.S. В папке "M" файлы и подпапки могут быть с разными именами, расширениями, размерами и атрибутами (системные, скрытые, только для чтения)


Это пример ДО выполнения скрипта:

C:\AT\AT-1\Круг © VF 办公室\VF 办公室 © Круг\Круг.txt

C:\M\Блок © VF 办公室\VF 办公室 © Блок\Блок.exe


Это пример ПОСЛЕ выполнения скрипта:

C:\AT\AT-1\Круг © VF 办公室\VF 办公室 © Круг\Круг.txt

C:\AT\AT-2\Блок © VF 办公室\VF 办公室 © Блок\Блок.exe

C:\M\

Fors1k 04-07-2020 16:19 2927204

Код:

param(
    $folder = "© VF 办公室",
    $proc  = "*calc",
    $pathAT = "C:\AT",
    $pathM  = "C:\M"
)cls

while(ps $proc -ea 0){sleep 1}
$at=1;if($at=([int]( gci  $pathAT  AT-* ).name[-1][-1].ToString())){$at++}
Move -l (gci $pathM *$folder).FullName (ni -i d "$pathAT\AT-$at").FullName


KOD65001 04-07-2020 19:16 2927219

Fors1k спасибо, но это не совсем то что нужно. Я же не просто так указал категорию темы "CMD/BAT", а не PowerShell.

YuS_2 04-07-2020 19:28 2927220

Цитата:

Цитата KOD65001
Я же не просто так указал категорию темы "CMD/BAT" »

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

Fors1k 04-07-2020 20:43 2927232

Цитата:

Цитата KOD65001
Я же не просто так указал категорию темы "CMD/BAT", а не PowerShell. »

Вообще, стоит уже забыть про cmd.

Разработка cmd была остановлена после выхода Windows 2000.В качестве основной командной оболочки используется PowerShell.
PowerShell заменяет командную строку. Если сказать совсем простым языком, то powershell - это и есть cmd, если у вас не Pentium2 на windows95.

Вы же, например, на море не на повозке ездите, а летаете на современном самолете.

Busla 04-07-2020 22:45 2927261

Тем не менее, "прогрессивное большинство" уже задрало сыпать в темы по cmd/bat офтопики на PoSh'е. Не нравится структура форума - иди с предложениями к администратору форума. А пока извольте следовать правилам.
Я сам предпочитаю решать задачи посредством PowerShell, но
1. Он не всегда есть - в том же PE, контейнерах
2. Он тяжело запускается - "примитивный" healthcheck, реализованный подобным образом, выжирает нереально много ресурсов
В темах про .bat люди ожидают находить решения на .bat

Iska 04-07-2020 23:50 2927270

Цитата:

Цитата Busla
В темах про .bat люди ожидают находить решения на .bat »

Если они возможны.

KOD65001 05-07-2020 00:08 2927273

Тогда это не подходит :( PowerShell не подходит.
Есть ещё какие-то варианты? например на VBS?

Цитата:

Цитата Busla
Тем не менее, "прогрессивное большинство" уже задрало сыпать в темы по cmd/bat офтопики на PoSh'е. Не нравится структура форума - иди с предложениями к администратору форума. А пока извольте следовать правилам.
Я сам предпочитаю решать задачи посредством PowerShell, но
1. Он не всегда есть - в том же PE, контейнерах
2. Он тяжело запускается - "примитивный" healthcheck, реализованный подобным образом, выжирает нереально много ресурсов
В темах про .bat люди ожидают находить решения на .bat »

Busla, в отличии от Вас я следую правилам! Я ничего не говорил про структуру форума! Не нужно хамить участникам форума, такое поведение здесь не уместно!

YuS_2, я не являюсь студентом!

Iska 05-07-2020 00:58 2927281

KOD65001, Ваш алгоритм неполон.
  1. Что делать, когда в каталоге C:\M нет ни одного подкаталога?
  2. Что делать, когда в каталоге C:\M более одного подкаталога?
  3. Что делать, если в каталоге C:\AT есть и подкаталог AT-1, и подкаталог AT-2?

Foreigner 05-07-2020 01:36 2927282

Код:

@echo off
setlocal

:check

tasklist | 1>nul findstr Calculator.exe && (
    1>nul timeout /t 1
    goto:check
)

2>nul (for /f "tokens=2 delims=-" %%i in ('dir /b /ad C:\AT\AT-*') do set /a "int=%%i+1")

if not defined int set "int=1"

dir /b C:\M | 1>nul findstr . && (

    md "C:\AT\AT-%int%"
    for /f "tokens=*" %%i in ('dir /b /ad "C:\M"') do move "C:\M\%%i" "C:\AT\AT-%int%"
)

с учетом дополнительных проверок,

Iska 05-07-2020 06:10 2927286

Foreigner,
Цитата:

Цитата KOD65001
процесс "calc.exe" »


Foreigner 05-07-2020 07:37 2927288


Цитата:

Цитата Iska
процесс "calc.exe" »

Нет такого в десятке.

Foreigner 05-07-2020 08:36 2927295

Код:

PS > calc
 PS > get-process calc
get-process : Cannot find a process with the name "calc". Verify the process name and call the cmdlet again.
At line:1 char:1
+ get-process calc
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (calc:String) [Get-Process], ProcessCommandException
    + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand

 PS > (Get-CimInstance win32_Process | ? { $_.Name -like 'calc*' }).CommandLine
"C:\Program Files\WindowsApps\Microsoft.WindowsCalculator_10.2005.23.0_x64__8wekyb3d8bbwe\Calculator.exe" -ServerName:App.AppXsm3pg4n7er43kdh1qp4e79f1j7am68r8.mca

 PS > (get-process Calculator).kill()


YuS_2 05-07-2020 09:14 2927299

Цитата:

Цитата KOD65001
Busla, в отличии от Вас я следую правилам! »

Хмм... в общем-то, то был спич в защиту именно Ваших требований о cmd/bat, Вас ни в чем не обвиняли. :)

Цитата:

Цитата KOD65001
YuS_2, я не являюсь студентом! »

В таком случае, не совсем понятно искусственное ограничение в cmd/bat и наличие псевдо-условий задачи. Зачем отслеживать калькулятор? Тем более, что наименование реального процесса, в разных версиях windows могут отличаться...
Приведите описание реальной проблемы во всех подробностях...
Например, непонятно:
Сколько всего может быть каталогов "AT-No"?
Сам сценарий запускаться будет вручную или по расписанию?
В общем, подробности таки требуются...

Цитата:

Цитата Busla
В темах про .bat люди ожидают находить решения на .bat »

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

megaloman 05-07-2020 12:53 2927323

CMD. Каталогов AT-X может быть много
Код:

@Echo Off
        Set "ImageName=calc.exe"
        Set /A TimeOut=5

        Set "BoxATnew=C:\AT\AT-"
        Set "BoxM=C:\M"

        :Check
                cls
                TaskList /Fi "ImageName Eq %ImageName%" |Find /I "%ImageName%" &&(
                        TimeOut /T %TimeOut%
                        GoTo :Check
                )

        Set /A N=0
        :DirMD
                Set /A N+=1
                If Exist "%BoxATnew%%N%" GoTo :DirMD

        Pushd "%BoxM%"
        xcopy /C /E /H /F "%BoxM%\*.*" "%BoxATnew%%N%\" &&2>nul Rd /S /Q "%BoxM%"
        Popd
pause
Exit /B


Foreigner, Move со скрытой папкой не отработает. Не уверен, отработает ли с папкой по имени VF 办公室 © Круг

YuS_2,
Цитата:

Цитата YuS_2
Зачем отслеживать калькулятор »

ИМХО, реально там будет что-то более экзотическое.

Busla,
Цитата:

Цитата Busla
В темах про .bat люди ожидают находить решения на .bat »

ИМХО, если это заявлено в категоричной форме. В противном, ИМХО, надо решать задачу. Увы, не всегда это в CMD возможно, и не вижу криминала, если предлагается решение иными средствами, если важно ехать, а не шашечки.
ИМХО, оффтоп -это не предложенное решение иными средствами, а панегирики на тему, какой же аццтой этот CMD, VBS и т д.

Foreigner 05-07-2020 13:11 2927326

Цитата:

Цитата megaloman
Не уверен, отработает ли с папкой по имени VF 办公室 © Круг »


У меня отработало.
Но, у меня все, включая cmd.exe, в UTF-8 без бом.

Iska 05-07-2020 13:31 2927327

Цитата:

Цитата Foreigner
Нет такого в десятке. »

:).

KOD65001 05-07-2020 13:35 2927329

Цитата:

Цитата YuS_2
наименование реального процесса, в разных версиях windows могут отличаться... »

YuS_2
Iska, Foreigner, "имя процесса" я в коде сразу исправил на свой. Процесс "calc.exe" - это просто для примера. Периодически на работе требуется менять процесс в зависимости от операций и поставленных задач начальством.

Foreigner, megaloman, Да это именно то, что нужно! Только код от Foreigner что-то не перемещает папку которая находится в папке "М", пробовал разные варианты UTF с бом и без..а вот у megaloman почему то хорошо перемещает...я так понимаю что в методе лучше использовать copy вместо move

Foreigner 05-07-2020 13:41 2927332

Вложений: 1
Цитата:

Цитата Iska
Нет такого в десятке. »

intl.cpl > Administartive > Change System Locale > Beta: Use Unicode UTF-8 for worldwide language support

KOD65001 05-07-2020 13:52 2927334

Спасибо ВСЕМ за помощь! :) megaloman, Foreigner, Fors1k - огромное спасибо за решение!

Iska 05-07-2020 18:32 2927348

Foreigner, Вы зачем-то процитировали не себя, а меня, попутно ответив на не заданный вопрос ;) (речь шла про Калькулятор).

YuS_2 05-07-2020 20:31 2927357

Foreigner, кстати да, в цитате речь про калькулятор же, а не про кодовую страницу... как-то сразу и не заметил :)

Foreigner 05-07-2020 21:12 2927363

Цитата:

Цитата YuS_2
кстати да, в цитате речь про калькулятор же, а не про кодовую страницу... как-то сразу и не заметил »

И не мудрено:

Цитата:

Цитата megaloman
Не уверен, отработает ли с папкой по имени VF 办公室 © Круг »

Цитата:

Цитата Foreigner
У меня отработало.
Но, у меня все, включая cmd.exe, в UTF-8 без бом. »

Цитата:

Цитата Iska
Нет такого в десятке »




Цитата:

Цитата Iska
Вы зачем-то процитировали не себя, а меня »

Значит я не понял, посчитал, что вы моей цитатой ответили мне. Так иногда бывает.

Iska 05-07-2020 21:48 2927367

Цитата:

Цитата Foreigner
Значит я не понял, посчитал, что вы моей цитатой ответили мне. »

Это я улыбнулся к тому, что, получается, не оставили даже болванку в виде write.exe → wordpad.exe?!

Foreigner 05-07-2020 22:06 2927371


Цитата:

Цитата Iska
что, получается, не оставили даже болванку в виде write.exe → wordpad.exe?! »

Файл calc.exe есть ( C:\Windows\System32\calc.exe ), поэтому его можно запустить 'calc', но процесса с таким именем нет ( есть Calculator.exe ), вот такая ситуация.
Что касается write, то он есть. Процесс wordpad.exe

Код:

PS > write.exe
 PS > get-ciminstance win32_process | ? { $_.Name -eq 'wordpad.exe' } | select CommandLine

CommandLine
-----------
"C:\Program Files\Windows NT\Accessories\wordpad.exe"


птичка0001 05-07-2020 22:37 2927374

Они ссылаются на C: \ Windows \ System32 \ calc.exe по причине обратной совместимости. А так, да, в настоящее время калькулятор один - современное приложение для Windows с открытым исходным кодом (на гитхабе).
Process Explorer выделяет Calculator.exe ярко-голубым (для WinRT), уровень целостности AppContainer (давно смотрела, но вряд ли что-то там изменилось).
  • https://github.com/microsoft/calculator ссылка на гитхаб
  • C:\Program Files\WindowsApps\Microsoft.WindowsCalculator_10.1910.0.0_x64__8wekyb3d8bbwe\Calculator.exe - расположение
  • two URL protocol: calculator and ms-calculator (URI)

//к делу не относится, но на всякий случай (вдруг кому-то интересно будет):
в NET Framework UseShellExecute = true используется по умолчанию;
в NET Core UseShellExecute = false - по умолчанию.
Причина: производительность. UseShellExecute очень специфичен для Windows и значительно медленнее.

Iska 06-07-2020 03:04 2927387

Цитата:

Цитата Foreigner
…но процесса с таким именем нет ( есть Calculator.exe ), вот такая ситуация. »

Это-то понятно. Я именно про болванку, по аналогии со write.exe.


Foreigner, спасибо, ясно.


Цитата:

Цитата птичка0001
в NET Framework UseShellExecute = true используется по умолчанию;
в NET Core UseShellExecute = false - по умолчанию. »

птичка0001, спасибо, ясно.

Цитата:

Цитата птичка0001
UseShellExecute очень специфичен для Windows и значительно медленнее. »

Я как-то смотрел, у Gunsmoker'а что-ли, разбор создания процесса «вглубь», так тихий ужас, сколько и чего там наворочено по факту…

Цитата:

Цитата птичка0001
//к делу не относится, но на всякий случай (вдруг кому-то интересно будет): »

Конечно интересно. Да и к делу относится.

Foreigner 06-07-2020 09:28 2927405

Цитата:

Цитата птичка0001
в NET Framework UseShellExecute = true используется по умолчанию;
в NET Core UseShellExecute = false - по умолчанию. »

Что-то я не понимаю. Например беру PowerShell-7, которая на Net Core:
Код:

PS > [Diagnostics.ProcessStartInfo]::new().UseShellExecute
False

Но при этом в ней запускаются процессы по файловой ассоциации. Или это из другой "оперы"?
Код:

PS > 11 > 11.txt
 PS > .\11.txt  # запускает notepad


птичка0001 06-07-2020 09:41 2927407

Насколько я знаю, поведение по Start-Process в PowerShell Core все ещё аналогично Windows PowerShell - все ещё &True; в NET Core по умолчанию &False.
См. следующую ссылку https://docs.microsoft.com/en-us/win...p-registration
И 2 ссылку: https://docs.microsoft.com/ru-ru/win...ectedfrom=MSDN

YuS_2 06-07-2020 12:44 2927434

Foreigner,
Цитата:

Цитата Foreigner
Файл calc.exe есть ( C:\Windows\System32\calc.exe ), поэтому его можно запустить 'calc', но процесса с таким именем нет ( есть Calculator.exe ), вот такая ситуация. »

Цитата:

Цитата YuS_2
Зачем отслеживать калькулятор? Тем более, что наименование реального процесса, в разных версиях windows могут отличаться... »


Foreigner 06-07-2020 13:32 2927437

Цитата:

Цитата YuS_2
Зачем отслеживать калькулятор? Тем более, что наименование реального процесса, в разных версиях windows могут отличаться... »

Не знаю, мне не надо. Меня спросили, я ответил.

YuS_2 06-07-2020 15:38 2927466

Цитата:

Цитата Foreigner
Не знаю, мне не надо. »

Это было про процесс Calculator.exe... и про
Цитата:

Цитата YuS_2
наименование реального процесса, в разных версиях windows могут отличаться »


птичка0001 08-07-2020 18:05 2927684


Iska,
Спасибо за рекомендацию, ознакомилась с целым циклом статей у него про ShellExecute и проч. (ранее я не знала блоге).
Цитата:

вглубь», так тихий ужас, сколько и чего там наворочено по факту
Тихий ужас - это слишком мягко сказано. Он использует более емкое определение: «говно мамонта» из 95 года :) На всякий случай: он не эксперт, и слепо доверять всему, что он пишет, мы не можем.


Время: 03:12.

Время: 03:12.
© OSzone.net 2001-