2

Я хотел бы написать .bat-файл, который открывает несколько папок, если ни одна из вышеупомянутых папок или файлов не открыта, и закрывает все несколько папок, если какая-либо из них открыта в Проводнике Windows или выполняется Windows.

Я думаю, что я могу решить условную проблему с помощью этого метода, упомянутого в cmd.exe: сложные условия? опубликовать, но я не могу заставить его работать для моих нужд во всем, что я пробовал.

set COND=
if COND1 set COND=1
if COND2 set COND=1
if defined COND ...

Я не уверен, как проверить, какие папки открыты в проводнике Windows, но я нашел близкое решение в окне cmd: Open explorer папки, если сообщение еще не открыто, но я все еще не могу выработать правильную логику для использования после нескольких попыток.

Есть ли более простой способ проверить, открыта ли папка или запущен процесс?

1 ответ1

2

Ниже приведен пакетный файл, в котором вы можете установить значения, заключенные в двойные кавычки и разделенные запятыми, в качестве путей к папкам, которые вы хотите открыть (т.е. <"FolderPathValue1">,<"FolderPathValue1">) в SET oPenArray= batch переменная.

При этом используется некоторая динамическая логика PowerShell, чтобы получить открытые папки и поместить их в файл, чтобы логика пакета FOR могла выполнять итерацию и соответственно использовать условную логику.

Чтобы лучше понять логику PowerShell, прочитайте соответствующие ссылки на вспомогательные ресурсы ; в противном случае вам нужно только указать пути к папкам в переменной SET oPenArray= .

Пакетный скрипт

@ECHO OFF

SET oPenArray="C:\Folder\Test","C:\Folder123\Prod"

SET "tmpFile=%temp%\oFolder.lst"
IF EXIST "%tmpFile%" DEL /Q /F "%tmpFile%"

CALL :PowerShell
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%'"
FOR /F "USEBACKQ TOKENS=*" %%A IN ("%tmpFile%") DO (
    FOR %%B IN (%oPenArray%) DO (
    IF /I NOT [%%~A]==[%%~B] EXPLORER "%%~B"
    )
)
EXIT

:PowerShell
SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
SET PSScript=%temp%\~tmpOpenFolders.ps1
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"

ECHO $app     = New-Object -COM 'Shell.Application'                             >> "%PSScript%"
ECHO $t       = $app.Windows() ^| Select-Object LocationURL                     >> "%PSScript%"
ECHO $x       = $t ^| %% {[string]$_.LocationURL -Replace "file:////", ""}      >> "%PSScript%"
ECHO $folders = $x.Replace("file:///", "").Replace("/","\").Replace("%%20"," ") >> "%PSScript%"
ECHO $folders ^| Out-File "%tmpFile%" -Encoding "ascii" -Append                 >> "%PSScript%"
GOTO :EOF

Вспомогательные ресурсы

  • FOR /F
  • FOR /?

        tokens=x,y,m-n  - specifies which tokens from each line are to
                          be passed to the for body for each iteration.
                          This will cause additional variable names to
                          be allocated.  The m-n form is a range,
                          specifying the mth through the nth tokens.  If
                          the last character in the tokens= string is an
                          asterisk, then an additional variable is
                          allocated and receives the remaining text on
                          the line after the last token parsed.
        usebackq        - specifies that the new semantics are in force,
                          where a back quoted string is executed as a
                          command and a single quoted string is a
                          literal string command and allows the use of
                          double quotes to quote file names in
                          file-set.
    
  • ЕСЛИ

  • Получить отчет обо всех открытых окнах проводника

  • Заменить ()

  • ForEach-Object

    Стандартные псевдонимы для объекта Foreach: символ « % », ForEach

  • Out-File
  • Вызов

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .