¿Cómo verificar si una carpeta está abierta o si el proceso se está ejecutando en Windows Explorer en cmd?

2

Me gustaría escribir un archivo .bat que abra varias carpetas si ninguna de las carpetas o archivos mencionados anteriormente están abiertos, y cierra todas las carpetas múltiples si alguna de ellas está abierta en el Explorador de Windows o está siendo ejecutada por Windows.

Creo que puedo resolver el problema condicional con este método mencionado en cmd.exe: ¿condiciones complejas? Publicar pero no puedo hacer que funcione para mis necesidades para todo lo que he probado.

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

No estoy seguro de cómo verifico qué carpetas están abiertas en el Explorador de Windows, pero encontré la solución cercana en el cmd: abrir la ventana del explorador de la carpeta si aún no está abierta, pero aún no puedo encontrar la lógica correcta para usar después de varios intentos.

¿Hay una manera más simple de verificar si una carpeta está abierta o si se ejecuta un proceso?

Jack el destripador
fuente

Respuestas:

3

A continuación se muestra un archivo por lotes que puede establecer los valores encerrados entre comillas dobles y separados por comas para que sean las rutas a las carpetas que desea abrir (es decir <"FolderPathValue1">,<"FolderPathValue1">) en la SET oPenArray=variable de lote.

Esto usa algo de lógica dinámica de PowerShell para obtener las carpetas que se abren y ponerlas en un archivo para que la FORlógica de lote pueda iterar y usar la lógica condicional en consecuencia.

Para comprender mejor la lógica de PowerShell si lo desea, lea los enlaces de Recursos de soporte correspondientes ; de lo contrario, solo debe preocuparse por colocar las rutas de la carpeta en la SET oPenArray=variable.

Script por lotes

@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

Recursos de apoyo

  • PARA / 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.
    
  • SI

  • Obtenga un informe de todas las ventanas abiertas del explorador

  • Reemplazar()

  • Para cada objeto

    Estándar Alias para Foreach-Object: el ' %símbolo', ParaCada

  • Out-File
  • Llamada
Pimp Juice IT
fuente
¿Es esto capaz de detectar una carpeta particular que está abierta? He oído que, independientemente de cuántas carpetas estén abiertas, solo habrá una instancia de explorer.exe ejecutándose ... y también ¿es posible hacer referencia a una carpeta en particular en win explorer y cerrarla? Solo conozco los comandos tskill o taskkill para cerrar procesos, pero si se usan para eliminar explorer.exe todas las carpetas se cerrarían ... y no puedo encontrar un comando que cierre una carpeta en particular en cmd.
Jack el Destripador
Tendría que hacer más pruebas, pero si tiene el PID de una carpeta en particular, entonces sí puede matar ese PID específico. Publiqué algo aquí superuser.com/questions/1102108/… y también otro aquí superuser.com/questions/1111762/… pero tengo que agotarme durante unas horas pero tendría que probar para darle un 100% de certeza en para confirmar y verificar según sus necesidades particulares y comprender cómo diferenciar entre 2 de las mismas carpetas.
Pimp Juice IT
@JacktheRipper ... Avíseme si se encontró con algún obstáculo con lo que le proporcioné, si necesita una lógica extendida para hacer algo más que pueda haber pasado por alto o que no haya probado lo suficiente como para emular tal situación para generar tal evento, etc. Solo necesito una comprensión clara y dado que no puedo sentarme contigo y hablar sobre ello o quizás sacarlo, veamos si puedes ayudarme a comprender mejor tus necesidades o problemas para que pueda ayudarte a intentar conseguir un trabajo solución que será suficiente para sus necesidades. ¡Soy capaz de ayudarte más, soy un recurso y estoy aquí, así que úsame!
Pimp Juice IT