@echo off
setlocal EnableDelayedExpansion
set /a N=0
for /f "tokens=* delims=" %%g in ('dir !FOLDERPATH! /b') do (
setlocal DisableDelayedExpansion
set "item=%%g"
endlocal
set /a N+=1
REM next line loses exclamation marks. replacing %%g with %%item%% gives error: not defined $$ variable
call set "$$%%N%%=%%g"
)
set "ind=%N%"
REM View the results
echo !ind!
for /f "tokens=* delims=" %%i in ('set $$') do echo %%i
pause
EXIT /b
我看我的问题(stackoverflow.com/questions/3262287许多解决方案的变量; stackoverflow.com/questions/28682268; stackoverflow.com/questions/29869394; stackoverflow.com/questions/3262287),我仍然很困惑。任何帮助赞赏保留跨DisableDelayedExpansion ENDLOCAL
我有一个包含感叹号(和百分号和&符号)的mp3文件名的文件夹。上面的子程序应该用这些文件名填充一个数组= $$。它被称为2000次,每次换一个不同的文件夹。
我想使用EnableDelayedExpansion作为主setlocal(快两倍)。在我的整个批处理程序中,这只是行(设置“item = %% g”),我需要DisableDelayedExpansion。我需要知道如何有效地通过DisableDelayedExpansion endlocal边界(并进入$$集)传递这个变量(item)。另外,我想我可以填充残疾人环境中的$$设置,然后我需要跨越边界传递设置。
我在寻找速度。我可以在整个子程序中使用Disabled,但是这会使处理时间加倍(对于很少的感叹号和百分比符号)。
根据我的反应,我发现包括整个批处理脚本(简化版)可能会很好。该脚本需要28分钟才能在我的小型机器上运行我的数据库。它处理感叹号,百分号,&符号以及其他任何可以扔到它的东西。
@echo off
chcp 1254>nul
setlocal DisableDelayedExpansion
set /p COUNT=Select Desired Number of Random Episodes per Album:
for /d %%f in (H:\itunes\Podcasts\*) do (
set buffer="%%f"
set /a ind = 0
call:Set$$Variables
setlocal EnableDelayedExpansion
if !COUNT! LEQ !ind! (set DCOUNT=!COUNT!) ELSE set DCOUNT=!ind!
for /l %%g in (1, 1, !DCOUNT!) do (
call:GenerateUniqueRandomNumber
for %%N in (!num!) do echo !$$%%N!>>"%USERPROFILE%\Desktop\RandomEpisodes.m3u8"
)
endlocal
)
pause
Exit /b
:Set$$Variables
set /a N = 0
for /f "tokens=* delims=" %%g in ('dir %buffer% /b') do (
set "item=%%g"
set /a N+=1
call set "$$%%N%%=%%item%%"
)
set "ind=%N%"
EXIT /b
:GenerateUniqueRandomNumber
:nextone
set /a "num = (((!random! & 1) * 1073741824) + (!random! * 32768) + !random!) %% !ind! + 1"
for %%N in (!num!) do (
if !RN%%N!==1 (
goto:nextone
)
set "RN%%N=1"
)
EXIT /b
对以下内容进行简单更改,并在13分钟后运行。但它不处理感叹号(bangs =!)。
@echo off
chcp 1254>nul
setlocal EnableDelayedExpansion
set /p COUNT=Select Desired Number of Random Episodes per Album:
for /d %%f in (H:\itunes\Podcasts\*) do (\
setlocal
set buffer="%%f"
set /a ind = 0
call:Set$$Variables
if !COUNT! LEQ !ind! (set DCOUNT=!COUNT!) ELSE set DCOUNT=!ind!
for /l %%g in (1, 1, !DCOUNT!) do (
call:GenerateUniqueRandomNumber
for %%N in (!num!) do echo !$$%%N!>>"%USERPROFILE%\Desktop\RandomEpisodes.m3u8"
)
endlocal
)
pause
Exit /b
:Set$$Variables
set /a N = 0
for /f "tokens=* delims=" %%g in ('dir %buffer% /b') do (
set "item=%%g"
set /a N+=1
call set "$$%%N%%=%%item%%"
)
set "ind=%N%"
EXIT /b
:GenerateUniqueRandomNumber
:nextone
set /a "num = (((!random! & 1) * 1073741824) + (!random! * 32768) + !random!) %% !ind! + 1"
for %%N in (!num!) do (
if !RN%%N!==1 (
goto:nextone
)
set "RN%%N=1"
)
EXIT /b
处理包含惊叹号的极少数文件名的处理时间超过了两倍。资源 - 时间猪是子例程Set $$ Variables。 所以我希望有人能在这两次之间找到一个快乐的中间地带:13分钟比28分钟。在我看来,必须有一种方法来处理15分钟差异中的十几个受影响的文件。
有没有你的文件名cotain'!'? – jeb
你的setlocal disabledDelayedExpansion/endlocal块不会设置任何变量,因为它在endlocal后被销毁 – jeb
我想你的代码通常是一个函数,或者你是否将所有代码按顺序从上到下写入? – jeb