Necesito un .bat con un par de requisitos.

Necesito un código para crear un archivo .bat (para Windows 10) que recorra un directorio que tiene muchos subdirectorios, y cada subdirectorio tiene a su vez hasta tres niveles de subdirectorios en su interior. Que en su recorrido el .bat muestre una lista del nombre y ruta de los subdirectorios que en su interior NO CONTIENEN archivos con las siguientes extensiones: mkv, mp4, mpg, rmvb, mov, divx, wmv, avi, flv, mpeg, rm. Y que a esa lista la envíe a un archivo de texto llamado "sin_peli.txt" que se guardará en el directorio del inicio.

En resumen, me interesa saber las rutas de los directorios en donde no hay películas con esas extensiones, aunque contengan otro tipo de archivos no relacionados.

1 respuesta

Respuesta
1

Prueba este bat

@echo off
set carpeta=d:\carpeta prueba
for /f "tokens=*" %%z in ('cd') do set dirini=%%z
del /q %dirini%\sin_peli.txt>nul 2>&1
pushd %carpeta%
for /f "tokens=*" %%z in ('dir /s/b *.*') do if not %%~xz==.mkv if not %%~xz==.mp4 if not %%~xz==.mpg if not %%~xz==.rmvb if not %%~xz==.mov if not %%~xz==.divx if not %%~xz==.wmv if not %%~xz==.avi if not %%~xz==.flv if not %%~xz==.mpeg if not %%~xz==.rm echo %%z>>%dirini%\sin_peli.txt
popd

En la variable CARPETA pones el path del directorio raíz a analizar (se podría pasar como parámetro y tratarlo con %1)

Acabo de darme cuenta de que pedías que, además de guardarse en el archivo SIN_PELI.TXT, debían mostrarse en pantalla los nombres. Para esto tendría que ser así:

@echo off
set carpeta=d:\carpeta prueba
for /f "tokens=*" %%z in ('cd') do set dirini=%%z
del /q %dirini%\sin_peli.txt>nul 2>&1
pushd %carpeta%
for /f "tokens=*" %%z in ('dir /s/b *.*') do if not %%~xz==.mkv if not %%~xz==.mp4 if not %%~xz==.mpg if not %%~xz==.rmvb if not %%~xz==.mov if not %%~xz==.divx if not %%~xz==.wmv if not %%~xz==.avi if not %%~xz==.flv if not %%~xz==.mpeg if not %%~xz==.rm echo %%z&echo %%z>>%dirini%\sin_peli.txt
popd

Gracias por tu pronta respuesta, estimado gggirald

No conseguí que funcionara. El resultado que arroja es una lista indiscriminada de directorios y archivos, muy similar a un dir /s /b

Solo quisiera que la lista arrojara la ruta del directorio que no contiene ninguna de la extensiones. Es decir, que por mas anidados que se encuentren los directorios, surja que en ninguno de ellos existe lo solicitado y solo en ese (o en esos)

Doy este ejemplo:

F:\[]PRUEBA\DIR-A1\DIR-B1\ejemplo.mp4
F:\[]PRUEBA\DIR-A1\uno.srt
F:\[]PRUEBA\DIR-A1\UNO.txt
F:\[]PRUEBA\DIR-A1\DIR-B1\DATA
F:\[]PRUEBA\DIR-A2\ejemplo.mkv
F:\[]PRUEBA\DIR-A3\DIR-B3\ejemplo.mov
F:\[]PRUEBA\DIR-A3\TRES.txt
F:\[]PRUEBA\DIR-A3\DIR-B3\DIR-C3
F:\[]PRUEBA\DIR-A3\DIR-B3\DIR-C3\data\ejemplo.rmvb
F:\[]PRUEBA\DIR-A4\Data
F:\[]PRUEBA\DIR-A5\DIR-B5\ejemplo.avi

en el cual  "F:\[]PRUEBA\DIR-A4\Data" no contiene ninguna de las extensiones mencionadas. Por lo que la lista de salida debería mostrar solo esa ruta.

Me disculpo si no logro resultar lo suficientemente claro  para expl,icarme. Puedo abundar al respectosi se necesita mayor precisión.

Agrego: creo que la palabra clave es EXCLUSIÓN. Más bien se trataría de excluir de la lista las rutas con las extensiones antedichas.

Tienes razón, te había entendido mal y eso que lo decías muy claro. A ver si ahora ya lo he entendido bien:

@echo off
set carpeta=c:\users\g\pictures
for /f "tokens=*" %%z in ('cd') do set dirini=%%z
del /q %dirini%\sin_peli.txt>nul 2>&1
pushd %carpeta%
for /f "tokens=*" %%z in ('dir /s/b /ad') do if not exist %%z\*.mkv if not exist %%z\*.mp4 if not exist %%z\*.mpg if not exist %%z\*.rmvb if not exist %%z\*.mov if not exist %%z\*.divx if not exist %%z\*.wmv if not exist %%z\*.avi if not exist %%z\*.flv if not exist %%z\*.mpeg if not exist %%z\*.rm echo %%z&echo %%z>>%dirini%\sin_peli.txt
popd

No funcionó. Continúa mostrando directorios que si contienen dichas extensiones, además de el que está vacío. Por otro lado, curiosamente no muestra a uno que sí contiene un .mp4. No imagino qué lo diferencia de los otros que también tienen .mp4, o .mkv, por caso.

Lo del directorio que está vacío no sé si se debería mostrar o no. Ya me lo aclararás. En cuanto a lo otro que comentas querría que hicieras lo siguiente:

1. Abre una ventana CMD/Símbolo del sistema y sitúate en la carpeta donde hayas puesto el BAT

2. Lanza el comando TYPE SINPELI.BAT (o el nombre que le hayas puesto al BAT)

3. Captura la pantalla con el resultado y pon por aquí esa captura

4. Si no te resulta demasiado complicado muéstrame un directorio que se incluya en el archivo SIN_PELI.TXT indebidamente porque tenga archivos con las extensiones "excluidas"

Primero, te paso el resultado actual de tu último.bat, "SIN_PELI.TXT":

Ahora la captura que pediste:

Y finalmente (no sé si te interpreté de forma correcta) una captura del directorio de prueba en su estado real donde advertirás el único directorio que carece de películas, el A4.

En la captura faltan los últimos caracteres de las líneas que superan el ancho de la ventana (una "v" y un "%") pero doy por hecho que sí que figuran.

Veo que el asunto es más complejo de lo que pensaba. Digamos que hay que trabajar a dos niveles de subcarpetas: la carpeta raíz y las subcarpetas de la carpeta raíz (subcarpetas de nivel 1). Si ninguna subcarpeta de una subcarpeta de nivel 1 tiene un archivo de los excluidos debe anotarse esa subcarpeta. No importa que (como DIR-A1\DIR-B1\DATA o DIR-A3\DIR-B3\DIR-C3\DATA) una subcarpeta concreta no tenga ningún archivo de los excluidos. Esto complica el tratamiento. A ver si mañana tengo un rato para intentar resolverlo.

Por cierto, si en tu árbol de ejemplo no estuviera TRES. MP4, ¿qué carpeta habría que anotar en el archivo de control? ¿F:\[]PRUEBA\DIR-A3? Si, como creo, es así nunca figurará una subcarpeta de nivel dos en ese archivo. ¿Es así?

Lamento lo de la captura. Acá un reemplazo:

Respecto a tu última presunción, es correcta. Siempre y cuando se compruebe la NO existencia de TRES.MP4 en ningún nivel de ese directorio. 

Al no ser yo muy avispado en el manejo de lenguaje batch, no imaginé que podía llegar a ser algo complicado de resolver, por lo cual valoro doblemente tu paciencia y el tiempo que dedicas.

Creo que ya lo tengo. Seguramente habrá una solución más "elegante" pero no se me ocurre en este momento:

@echo off
Setlocal EnableDelayedExpansion
set carpeta=d:\[]PRUEBA
for /f "tokens=*" %%z in ('cd') do set dirini=%%z
del /q %dirini%\sin_peli.txt>nul 2>&1
pushd %carpeta%
for /f "tokens=*" %%z in ('dir /b /ad') do (
   set control=S
   call :tratadir "%carpeta%\%%z"
   if !control!==S (echo %carpeta%\%%z&echo %carpeta%\%%z>>%dirini%\sin_peli.txt)
   )
popd
goto :eof
:tratadir
if exist %~1\*.mkv  (set control=N&goto :eof)
if exist %~1\*.mp4  (set control=N&goto :eof)
if exist %~1\*.mpg  (set control=N&goto :eof)
if exist %~1\*.rmvb (set control=N&goto :eof)
if exist %~1\*.mov  (set control=N&goto :eof)
if exist %~1\*.divx (set control=N&goto :eof)
if exist %~1\*.wmv  (set control=N&goto :eof)
if exist %~1\*.avi  (set control=N&goto :eof)
if exist %~1\*.flv  (set control=N&goto :eof)
if exist %~1\*.mpeg (set control=N&goto :eof)
if exist %~1\*.rm   (set control=N&goto :eof)
for /f "tokens=*" %%a in ('dir "%~1" /b/s /ad') do (
   if exist %%a\*.mkv  (set control=N&goto :eof)
   if exist %%a\*.mp4  (set control=N&goto :eof)
   if exist %%a\*.mpg  (set control=N&goto :eof)
   if exist %%a\*.rmvb (set control=N&goto :eof)
   if exist %%a\*.mov  (set control=N&goto :eof)
   if exist %%a\*.divx (set control=N&goto :eof)
   if exist %%a\*.wmv  (set control=N&goto :eof)
   if exist %%a\*.avi  (set control=N&goto :eof)
   if exist %%a\*.flv  (set control=N&goto :eof)
   if exist %%a\*.mpeg (set control=N&goto :eof)
   if exist %%a\*.rm   (set control=N&goto :eof)
   )

Y no te preocupes por el tiempo que le dedique. Me gusta mucho esto y agradezco, de vez en cuando, una complicación nueva.

Amigo gggirald... ¡extraordinario! ¡Anduvo perfecto!

Solo pasé un pequeño susto al probarlo la primera vez, porque arrojó un resultado imprevisto. La línea 

set carpeta=d:\[]PRUEBA

debió ser drive f: Felizmente se me ocurrió  hacer un chequeo rápido del código y lo subsané. Imagino que lo probaste en tu unidad D y allí quedó, inadvertido.

¡Infinitas gracias! Segunda vez que me sacas de un aprieto.

Efectivamente. Era mi "entorno de pruebas" y olvidé retocarlo para ajustarlo al tuyo, porque si no se parece no hay problema pero si se parece mucho es más probable pensar que ya está ajustado.

Me alegro mucho de haberlo resuelto.

¡Gracias! 

Creo que he encontrado una versión más compacta. Es esta:

@echo off
Setlocal EnableDelayedExpansion
set carpeta=f:\[]PRUEBA
for /f "tokens=*" %%z in ('cd') do set dirini=%%z
del /q %dirini%\sin_peli.txt>nul 2>&1
pushd %carpeta%
for /f "tokens=*" %%z in ('dir /b /ad') do (
   set control=S
   call :tratadir "%carpeta%\%%z"
   if !control!==S (echo %carpeta%\%%z&echo %carpeta%\%%z>>%dirini%\sin_peli.txt)
   )
popd
goto :eof
:tratadir
for %%e in (.mkv .mp4 .mpg .rmvb .mov .divx .wmv .avi .flv .mpeg .rm) do (
   if exist %~1\*%%e  (set control=N&goto :eof)
   for /f "tokens=*" %%a in ('dir "%~1" /b/s /ad') do if exist %%a\*%%e  (set control=N&goto :eof)
   )

Tiene la ventaja de que las extensiones a controlar están agrupadas en una única instrucción (el primer FOR de la subrutina TRATADIR) con lo que es mucho más fácil adaptar el BAT si hubiera que hacer algún cambio. Si te parece bien lo pruebas y me confirmas que sigue funcionando igual de bien. Ya he tenido en cuenta tu "entorno de pruebas" al cambiar a "f:" el drive

Estimado gggirald, agradezco mucho esta inesperada mejora en el código que seguramente conforma ahora tu concepto de concisión y elegancia :-)

Pero, tanto en esta versión como en la anterior, me veo enfrentado al problema siguiente:

como era un mero directorio de pruebas, ideal, no tuve en cuenta que los títulos de las pelis no se ajustan al criterio que utilicé para nombrar directorios. Debí informarte que cada directorio (DIR-A1, DIR-A2...) correspondía puntualmente al título de una película. Mea culpa. Es decir, los títulos la mayoría de las veces suelen estar sin guion entre una palabra y la siguiente. 

De modo que "El padrino II", no suele ser "El-padrino-II", ni "El_padrino_II" Y digo no suele, porque en algunos pocos casos, sí tengo los títulos con los molestos guiones. Es decir, surge -creo- el bendito problema del entrecomillado... que no sé cómo se resuelve. Y que su resolución resulte aplicable de un modo genérico, tanto para títulos con guiones como sin ellos, altos y bajos (- _)

¿Se te ocurre alguna forma de conciliar esto?

Así las cosas, el .bat actual funciona siempre y cuando el nombre del directorio y los subdirectorios se encuentren en el formato  DIR-A1, DIR-A2... pero no en el caso DIR A1, DIR A2. En este último caso simplemente parece no encontrar qué recorrer o listar.

Me corrijo con urgencia. El problema de los espacios en blanco entre una palabra y la siguiente parece ocurrir solo en el primer nivel de directorios, y NO en los subdirectorios. Hice algunas pruebas para constatarlo. Este dato quizás ayude.

Ahora no tengo posibilidad de hacer pruebas porque no estoy en casa, pero creo que debería ser suficiente con poner entre comillas lo que sigue a los IF EXIST. Prueba y me dices

Quiero decir algo como:

if exist "%~1\*%%e" (set control=N&goto :eof)

Ya he podido probar, y creo que la solución propuesta es válida. Ya me dirás

Estimado gggirald, chapeau.

Anduvo perfecto. ¡Mil gracias!

Que pases buen fin de semana.

Bueno, al parecer, como suele decirse, canté victoria antes de tiempo.

Cometí el error de ejecutar el bat solo en el directorio que armé para probarlo. De modo equivocado, di por sentado que también funcionaría en otro contexto.

Sin embargo, cuando fui a ejecutar el bat en el drive real, una unidad externa (File System NTFS, Seagate, 1,81 TB), donde se encuentran las pelis a revisar... no funcionó. Si sirve el dato, unidad operada desde Windows 10 (File system NTFS).

También lo probé en otra máquina en donde me manejo con Windows 7 Ultimate (File System NTFS), y tampoco allí lo hizo.

Gran desconcierto.

Algo había leído por ahí sobre el engorro de los espacios en blanco y nombres largos, pero no imaginé que fuera algo tan molesto de tratar.

Quizás tengas un as en la manga o se te ocurra una alternativa para sortear este inconveniente, al cual sigo imaginando como originado en los espacios en blanco. A menos que sea otra cosa.

Yo diría que debe ser otra cosa, porque también los directorios típicos de Windows10 se montan sobre NTFS. ¿Puedes probar en un entorno controlado en esas dos instalaciones, donde no funciona, para ver si tienen que ver los espacios del nombre o no es esa la causa?

Yo me inclino por un par de cosas: que falte incluir alguna extensión de archivos de vídeo entre las exclusiones o la presencia en algún nombre de directorio de caracteres problemáticos para los bat (como %, $, >, <, etc.). ¿En qué notas que no funciona correctamente? ¿En la presencia en SIN_PELI.TXT de carpetas que sí que contienen archivos de vídeo? ¿En la ausencia en ese archivo de carpetas que no contienen archivos de vídeo? ¿En la aparición de mensajes tipo "No se esperaba ... en este momento? ¿En algún otro mensaje de error?

Añadiría a las posibles causas del problema, la que ya apuntabas tú, longitud excesiva del nombre de algún subdirectorio o del path completo

Amigo gggirald, creo que estoy en vias de solucionarlo.

Al parecer, a este .bat no le caen bien los inocuos paréntesis al comienzo del directorio principal en donde se aloja el bat. De modo que -al menos en mi caso- un directorio no puede comenzar así: ()PELIS, sino que debe denominarse simplemente PELIS. Y al cambiar el nombre, santo remedio... el bat funciona.

Lo comprobé en la unidad externa de 2 TB en donde antes no había funcionado. Ahora lo hizo, aunque con algunas particularidades.

No reconoce los siguientes signos:

el de exclamación ! y los apóstrofes, tan comunes en el idioma inglés.

Así que que cuando se topa con estos símbolos vuelca a la lista el nombre del directorio, como que no hay en él una película, siendo que sí existe.

Respecto a probar en Windows 7 Ultimate, en este momento me encuentro lejos de la máquina, pero sospecho que debería idéntica solución. En cuanto lo pruebe, te aviso el resultado.

Llevo un par de días intentando conectarme con la página. Llegué a temer que se hubiera desconectado definitivamente (no me extrañaría mucho porque creo que se ha descuidado bastante el mantenimiento, pero sería una pena porque creo que todavía puede ayudar bastante).

Bueno, creo que vas muy bien encaminado. De hecho era a este tipo de problemas a lo que me refería con "la presencia en algún nombre de directorio de caracteres problemáticos para los bat (como %, $, >, <, etc.)"

Me pasó igual. No pod[ia acceder a esta web y no encontraba ninguna información actualizada, fuera del sitio, que permitiera saber qué pasaba.

Bueno, solo para decirte que la prueba en Windows 7 arrojó el mismo resultado. Funcionó, pero todavía se mantiene esa molesta alteración que no permite excluir  -o incluir, en caso de que sí lo requiera- los nombres con apóstrofe en las carpetas, al igual que los de exclamación al final de ciertos nombres. Estos últimos escasos, por suerte. No así los primeros, abundantes en los títulos de películas en el idioma de Shakespeare.

Afortunadamente parece que el problema de acceso a la página está resuelto. Espero que no se confirmen mis temores y que siga existiendo mucho tiempo.

Los problemas que estás sufriendo son los típicos de la falta de "transparencia" de la shell de MSDOS en Windows. Hay demasiados caracteres que tienen un significado especial en esa shell sin que estén habilitados mecanismos para distinguir claramente cuando esos caracteres significan algo especial o simplemente forman parte de una cadena literal y, por tanto, no hay que considerarlo especiales. La otra shell de Windows, PowerShell (o PS para los amigos) suele servir para soslayar esos problemas. No tengo demasiada experiencia con ella pero he preparado un script de PS que podría servir para este caso. Es este:

$carpeta="d:\PRUEBA"
$dirini=Get-Location
Remove-Item sin_peli.txt -ErrorAction:SilentlyContinue
Push-Location $carpeta
$listDir1 = Get-ChildItem | Where {$_.PsIsContainer -eq $true} | % FullName
foreach ($dir1 in $listDir1) {
   $control="S"
   foreach ($ext in (".mkv", ".mp4", ".mpg", ".rmvb", ".mov", ".divx", ".wmv", ".avi", ".flv", ".mpeg", ".rm")) {
      if (test-path -path "$dir1\*$ext") { $control="N"; break }
      Set-Location -path $dir1
      $listDir2 = gci -r | Where {$_.PsIsContainer -eq $true} | % FullName
      foreach ($dir2 in $listDir2) {
         if (test-path -path "$dir2\*$ext") { $control="N"; break }
         }
      }
   if ($control -eq "S") {
      Write-Host $dir1
      $dir1 | Out-File -FilePath $dirini\sin_peli.txt -Append -Encoding default
      }
}
Pop-Location

Debería hacer lo mismo que el bat pero sin problemas a la hora de tratar directorios que contengan en el nombre caracteres como admiración, apóstrofes, etc. Pero también dan problemas algunos otros caracteres, como [ y ].

Si no tienes experiencia en PS esto es lo que tendrías que hacer:

1. Copiar el script anterior en un archivo de texto con extensión PS1 (en vez de BAT). Modifica, previamente, la línea que asigna el valor a la variable $CARPETA. No puede tener los caracteres [ ni ], que no daban problemas en el BAT pero sí los dan en PS1

2. Abrir una ventana PS, similar a la CMD de MSDOS. Para ello abres la ventana de "Ejecutar" y tecleas PowerShell

3. Te sitúas en la ventana de PS en el directorio en el que hayas guardado el script PS1. Supongamos que le has llamado VACIOS. PS1

4. Tecleas .\VACIOS

Me parece recordar que si nunca has usado PS puede salirte algún error en este punto, pero tal vez no.

Ya me contarás.

Por mi parte voy a intentar resolver el problema de los caracteres [ y ] porque no me encaja que no haya forma de abordarlo en PS

Creo que ya lo tengo claro. Los problemas los crean los caracteres que se pueden usar como comodines en los comandos del sistema operativo, por ejemplo [, ],*,?. Si algún directorio o archivo puede contener esos caracteres hay que explicitar la opción -LiteralPath en el comando que vaya a usar ese nombre. Pero eso impide usar los comodines como tales comodines. Por tanto hay que situarse "manualmente" en el directorio si se quieren usar comodines (como es nuestro caso para hacer búsquedas por extensión). Este script de PS podría servirnos si todo va como creo:

$carpeta="d:\[]PRUEBA"
$dirini=Get-Location
Remove-Item sin_peli.txt -ErrorAction:SilentlyContinue
Push-Location -LiteralPath $carpeta
$listDir1 = Get-ChildItem | Where {$_.PsIsContainer -eq $true} | % FullName
foreach ($dir1 in $listDir1) {
   $control="S"
   foreach ($ext in (".mkv", ".mp4", ".mpg", ".rmvb", ".mov", ".divx", ".wmv", ".avi", ".flv", ".mpeg", ".rm")) {
      Set-Location -Literalpath $dir1
      if (test-path *$ext) { $control="N"; break }
      $listDir2 = gci -r | Where {$_.PsIsContainer -eq $true} | % FullName
      foreach ($dir2 in $listDir2) {
         Set-Location -Literalpath $dir2
         if (test-path *$ext) { $control="N"; break }
         }
      }
   if ($control -eq "S") {
      Write-Host $dir1
      $dir1 | Out-File -FilePath $dirini\sin_peli.txt -Append -Encoding default
      }
}
Pop-Location

Ahora ya se pueden tratar los caracteres [ y ] en los nombres de directorios porque cada vez que se va a usar el nombre del directorio se incluye la opción "-LiteralPath". Una vez situados en el directorio que interesa ya se hace la búsqueda con comodines.

Amigo gggirald, no me resultó posible responderte de forma inmediata. Pero déjame decirte que tu script ahora funciona de maravillas!

Nunca antes había usado PowerShell y, prestando atención, descubrí que con este script PowerShell aparece ahora integrado al menu contextual derecho del mouse y también resulta fácil de editar.

El único inconveniente reside en que los [ ] de apertura y cierre, si los tiene la carpeta principal []PRUEBA, en donde se corre el PS1, da error y cierra PowerShell. No alcancé a leer el mensaje de error.

Pero, si la carpeta principal cuenta con ( ) y se llama ()PRUEBA, corre sin inconvenientes, incluso subcarpetas con [ ] en su nombre, y con ! Y apostrofes, y palabras en español con tilde. Para mí, así, está perfecto, gggirald. Te imaginarás que no es para nada un inconveniente quitar los [ ] de la carpeta principal.

En cuanto tenga tiempo pienso dedicar algo de él a conocer un poco más de PowerShell. Sé que tiene buena fama y más prestaciones que los viejos comandos.

Quedo infinitamente agradecido por esta ayuda y tu admirable dedicación.

¡Un saludo cordial!

Me alegra mucho saber que has conseguido probar con PS. Como te digo por ahí el PS suele ser la solución para todos los problemas que no se pueden resolver por la falta de "transparencia" de la shell tradicional, y los BAT. El problema que le encuentro al PS es que resulta de una complejidad muy superior al MSDOS tradicional.

En este punto me gustaría saber si has probado la segunda versión del PS1, la que considero que debe resolver el problema de que la carpeta de partida sea []PRUEBA. En mis pruebas ese problema parece resuelto, aunque no se da la circunstancia de que el PS1 esté, precisamente, en esa misma carpeta. Voy a probar a situar ese script en esa carpeta a ver si me ocurre lo que dices, el cierre de la ventana de PS.

Ya he probado y, en ese caso da un error, pero es al grabar el archivo SIN_PELI.TXT, precisamente porque la instrucción correspondiente no incluye la opción "-LiteralPath". Con esta nueva versión ya debería estar todo resuelto:

$carpeta="d:\[]PRUEBA"
$dirini=Get-Location
Remove-Item sin_peli.txt -ErrorAction:SilentlyContinue
Push-Location -LiteralPath $carpeta
$listDir1 = Get-ChildItem | Where {$_.PsIsContainer -eq $true} | % FullName
foreach ($dir1 in $listDir1) {
   $control="S"
   foreach ($ext in (".mkv", ".mp4", ".mpg", ".rmvb", ".mov", ".divx", ".wmv", ".avi", ".flv", ".mpeg", ".rm")) {
      Set-Location -Literalpath $dir1
      if (test-path *$ext) { $control="N"; break }
      $listDir2 = gci -r | Where {$_.PsIsContainer -eq $true} | % FullName
      foreach ($dir2 in $listDir2) {
         Set-Location -Literalpath $dir2
         if (test-path *$ext) { $control="N"; break }
         }
      if ($control -eq "N") { break }
      }
   if ($control -eq "S") {
      Write-Host $dir1
      $dir1 | Out-File -LiteralPath $dirini\sin_peli.txt -Append -Encoding default
      }
}
Pop-Location

Amigo gggirald, debo decir que antes no se me había ocurrido situarme fuera de la carpeta []PRUEBA para ejecutar el PS1 de marras.

En esta última versión, ejecutada DENTRO de dicha carpeta, continúa sin admitir los [ ]

Pero, si lo ejecuto desde la raíz de la unidad F: reconoce perfecto los [ ] de la carpeta PRUEBA y todo lo que hay en su interior, incluyendo otros [ ], mas los apostrofes, etc.

De este modo, al menos en lo que a mi respecta, continúa trabajando perfecto y me resulta muy útil. Pero si quieres hacer alguna otra prueba como desafío intelectual o mera curiosidad, estoy a la orden. 

¡Saludos cordiales!

Como no me gusta dejar cabos sueltos te pediría que ejecutes el PS1 desde dentro de la carpeta []PRUEBA, pero no ejecutando el PS1 desde el explorador de Windows, como creo que estás haciendo ahora, sino en modo "consola", es decir de forma similar al CMD/Símbolo de sistema pero con la consola de PS. Para ello solo tienes que utilizar la ventana "Ejecutar" pulsando con el botón derecho sobre la ventanita de Windows (Inicio), seleccionando esa opción, escribiendo "powershell". Te saldrá una ventana azul como esta:

Te sitúas en la unidad/carpeta correspondiente a []PRUEBA, tecleas un TYPE para ese PS1 (para poder ver si tiene el último cambio incluido) y ejecutas el PS1 tecleando su nombre (como harías con un BAT) pero precedido de ".\", es decir si al PS1 le has llamado VACIOS. PS1 debes teclear:

.\VACIOS. Si hay errores capturas la pantalla y me la pones por aquí.

Lastimosamente, no pude avanzar mas allá de tu primera instrucción.

Como verás en la captura adjunta, aún para cambiar de directorio, los [ ] y los ( ) se siguen interponiendo. No así en el directorio COVERS al cual PowerShell accede sin problemas.

Todo esto suponiendo yo que la orden cd, aún bajo PowerShell permite cambiar de directorio...

¿O es que hago algo mal? Misterio...

Lo cierto es que yo no lo había probado. Ya lo he hecho y aquí esté mi captura de pantalla:

Como ves la solución, también con el nuevo comando CD, es usar la opción "-LiteralPath".

Mi intento... y la captura:

Visite la página de microsoft linkeada al error, pero no me fue posible desentrañar la manera de hacer efectiva la habilitación de process, por ejemplo.

No ha habido suerte en lo que se refiere a la ejecución de un script desde la consola de PS. Al final se confirmó mi temor, manifestado en mi mensaje del 3 de marzo como "si nunca has usado PS puede salirte algún error en este punto, pero tal vez no."

Pero antes de abordar la solución del problema que presentas en el pantallazo sí que ha servido el TYPE para comprobar que el comando de escritura en el archivo SIN_PELI.TXT no ha incorporado la opción "-LiteralPath" que era la modificación incluida en mi mensaje del 5 de marzo. Esa línea debería ser:

$dir1 | Out-File -LiteralPath $dirini\sin_peli.txt -Append -Encoding default

pero lo que se ve en el pantallazo es la versión anterior

$dir1 | Out-File -FilePath $dirini\sin_peli.txt -Append -Encoding default

Creo que esto explica que no se haya resuelto del todo el problemilla.

En cuanto a la forma de resolver el problema manifestado con el mensaje "cannot be loaded because running scripts is disabled on this system” estos serían los pasos a dar:

1. Escribir powershell en la ventanita de Cortana y elegir la opción "Windows Powershell Aplicación" pinchando con el botón derecho del ratón para poder elegir "Ejecutar como administrador"

2. En la consola de PS Administrador teclear el comando "Get-ExecutionPolicy" para comprobar que la política de ejecución tiene un valor distinto a "RemoteSigned".

3. Si, como espero, es así, teclear el comando "Set-ExecutionPolicy RemoteSigned"

4. Repetir el comando del punto 2 para comprobar que el cambio se ha realizado

Con esto ya debes poder ejecutar desde consola el script .\prueba.ps1

Ya me contarás.

Insisto en darte las gracias por la ayuda que me estás prestando para avanzar en este asunto

Amigo gggirald, éxito total!

En la captura apreciarás rápidamente a qué me refiero:

Ahora, un par de salvedades: abochornado, debo admitir que previamente, tenía en el .PS1 de prueba la línea 

$dir1 | Out-File -LiteralPath $dirini\sin_peli.txt -Append -Encoding default

pero, entre tantos cambios y pruebas que hice aquí y allá, al momento de enviarte la prueba clave, por equivocación, para hacer la captura de pantalla. ejecuté un PS1 descartado. Cuando señalaste la falta de esa línea recien entonces advertí mi error.

Lo segundo, es que no tengo habilitado Cortana en mi sistema, -ni tampoco tengo muchas ganas de tenerlo-, por lo cual ejecuté PowerShell desde el menú Start de Windows, accediendo a la respectiva carpeta de PowerShell y listo. Tus instrucciones eran muy claras.

En resumen, el PS1 funciona correctamente dentro de la carpeta principal con [ ] de prueba y lista sin problemas dentro de esta carpeta, en un .txt, el resultado requerido. Siempre y cuando se atiendan las políticas de seguridad que maneja PowerShell. Para que quede asentado por si a alguien le resulta de utilidad.

Pienso que esto te puede dejar conforme.

¡Saludos cordiales! 

Perfecto. Queda todo aclarado, aunque si en algún momento ejecutaste el PS1 con la línea correcta y no funcionó bien todavía podría haber algo pendiente, pero imagino que las últimas pruebas demuestran que no es así y que, ahora, ya toda va bien con independencia de la ubicación del PS1

Quiero añadir que me ha venido muy bien tu consulta para profundizar un poquito en PS. Soy incapaz de aprender nada si no es trabajando sobre algo concreto y así es como voy avanzando en PS, usándolo cuando el MSDOS se queda corto. Y en este caso estoy encantado de haber servido para que alguien más, tú, claro, se estrene en este interesante mundo.

Un cariñoso saludo y hasta otra ocasión.

De nada amigo!  Mi reconocimiento y felicitaciones.

Hasta otra

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas