А в каком порядке он может обходить массив?Кто его знает, может в порядке присваивания значений элементам (хотя на самом деле, думаю, в VBS это не так, но мало ли какие сюрпризы возможны).
VBS массивы в кач-ве аргумента функции не ест.Я видел ваш вопрос. По-моему вы ошибаетесь.
%%i
, %%~fi
. FOR /F
пропускает пустые строки, чтобы этого не происходило можно пропустить файл через find
с выводом номеров строк (/n
) и последующим отбрасыванием их:@echo off
Setlocal EnableDelayedExpansion
(for /f "tokens=1* delims=]" %%1 in (
'start /b find /n /v ""^<rotor.txt'
) do (
set "val=%%2"
if defined val set "val=!val:-=!"
echo(!val!
))>rotor_new.txt
start /b
. Если это убрать, то всё будет работать так же, но, по моим ощущениям, несколько медленнее. Дело в том, что в FOR/F все команды: не только внутренние (как это происходит с ними в конвейере |
, и что можно было бы ещё понять), но и внешние программы запускаются не напрямую, а через дополнительную копию обработчика командной строки, т. е. не просто find ...
, а cmd.exe /c find ...
. И при помощи start /b
вспомогательный процесс cmd.exe получает указание не ожидать впустую завершения запущенной им программы.set /p
из подпрограммы на вход которой перенаправлен файл (call :sub <rotor.txt
), но при этом возникает затруднение с определением окончания ввода, обойти его можно, например, предварительно дописав в конец файла строку, заведомо не встречающуюся в нём. token
на tokens
или совсем уберите token=*
(delims=
оставьте). (for ... do (
...
))>rotor_new.txt
— файл на запись будет открыт однократно и заблокирован на это время от изменения другими программами, например, если скрипт будет случайно запущен дважды.
Можете попробовать в корневом
(Строго говоря, по спецификации в таких случаях положено отдавать код ошибки 405 и заголовок
Allow
, но это лишнее разглашение информации.)