Как делает “ДЛЯ” работы в cmd пакетном файле?

Я попытался в этой модели в соответствии с моими требованиями. Мне нужно сохранить дату, когда когда-либо создается объект. Я хочу получить все записи (документы) между двумя датами в моем html-файле. Я использовал следующий формат: mm / dd / yyyy

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>

    <script>
//jquery
    $(document).ready(function(){  
    $("#select_date").click(function() { 
    $.ajax({
    type: "post",
    url: "xxx", 
    datatype: "html",
    data: $("#period").serialize(),  
    success: function(data){
    alert(data);
    } ,//success

    }); //event triggered

    });//ajax
    });//jquery  
    </script>

    <title></title>
</head>

<body>
    <form id="period" name='period'>
        from <input id="selecteddate" name="selecteddate1" type="text"> to 
        <input id="select_date" type="button" value="selected">
    </form>
</body>
</html>

в моем файле py (python) я преобразовал его в «iso fomate» следующим образом

date_str1   = request.POST["SelectedDate1"] 
SelectedDate1   = datetime.datetime.strptime(date_str1, '%m/%d/%Y').isoformat()

и сохранен в моей коллекции dbmongo с помощью «SelectedDate» «как поле в моей коллекции

для извлечения данных или документов между двумя датами, которые я использовал в следующем запросе

db.collection.find( "SelectedDate": {'$gte': SelectedDate1,'$lt': SelectedDate2}})
23
задан Sake 4 May 2009 в 02:25
поделиться

8 ответов

Ни один из ответов на самом деле не работает. Мне удалось найти решение самостоятельно. Это немного глупо, но это решает проблему для меня:

echo off
setlocal enableextensions
setlocal enabledelayedexpansion
set MAX_TRIES=100
set P=%PATH%
for /L %%a in (1, 1, %MAX_TRIES%) do (
  for /F "delims=;" %%g in ("!P!") do (
    echo %%g
    set P=!P:%%g;=!
    if "!P!" == "%%g" goto :eof
  )
)

О! Я ненавижу программирование пакетных файлов !!

Обновлено

Решение Марка проще, но оно не будет работать с путями, содержащими пробелы. Это немного модифицированная версия решения Марка

echo off
setlocal enabledelayedexpansion
set NonBlankPath=%PATH: =#%
set TabbedPath=%NonBlankPath:;= %
for %%g in (%TabbedPath%) do (
  set GG=%%g
  echo !GG:#= !
)
12
ответ дан 29 November 2019 в 02:22
поделиться

for /f выполняет итерации для каждого ввода строки, поэтому в вашей программе будет выводиться только первый путь.

Ваша программа обрабатывает% PATH% как однострочный ввод и уменьшает его на ;, сначала помещает результат в %% g, затем выводит %% g (первый разграниченный путь).

2
ответ дан Francis 29 November 2019 в 02:22
поделиться

Это работает для меня:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
@REM insure path is terminated with a ;
set tpath=%path%;
echo.
:again
@REM This FOR statement grabs the first element in the path
FOR /F "delims=;" %%I IN ("%TPATH%") DO (
  echo    %%I 
  @REM remove the current element of the path
  set TPATH=!TPATH:%%I;=!
)
@REM loop back if there is more to do. 
IF DEFINED TPATH GOTO :again

ENDLOCAL
2
ответ дан Cheeso 29 November 2019 в 02:22
поделиться

Вот хорошее руководство:

FOR / F - команда цикла: для набора файлов.

FOR / F - команда цикла: против результатов другой команды.

FOR - команда цикла: все опции Файлы, Каталог, Список.

[Полное руководство (команды Windows XP):

http://www.ss64.com/nt/index.html

Редактировать : Извините, не увидел, что ссылка уже была в OP, так как она показалась мне как часть ссылки на Amazon.

1
ответ дан TFM 29 November 2019 в 02:22
поделиться

You've got the right idea, but for /f is designed to work on multi-line files or commands, not individual strings.

In its simplest form, for is like Perl's for, or every other language's foreach. You pass it a list of tokens, and it iterates over them, calling the same command each time.

for %a in (hello world) do @echo %a

The extensions merely provide automatic ways of building the list of tokens. The reason your current code is coming up with nothing is that ';' is the default end of line (comment) symbol. But even if you change that, you'd have to use %%g, %%h, %%i, ... to access the individual tokens, which will severely limit your batch file.

The closest you can get to what you ask for is:

set TabbedPath=%PATH:;= %
for %%g in (%TabbedPath%) do echo %%g

But that will fail for quoted paths that contain semicolons.

In my experience, for /l and for /r are good for extending existing commands, but otherwise for is extremely limited. You can make it slightly more powerful (and confusing) with delayed variable expansion (cmd /v:on), but it's really only good for lists of filenames.

I'd suggest using WSH or PowerShell if you need to perform string manipulation. If you're trying to write whereis for Windows, try where /?.

4
ответ дан 29 November 2019 в 02:22
поделиться

FOR , по сути, выполняет итерацию по «линиям» в наборе данных. В этом случае есть одна строка, которая содержит путь. "delims =;" просто говорит ему разделить на точки с запятой. Если вы измените тело на echo %% g, %% h, %% i, %% j, %% k , вы увидите, что он обрабатывает ввод как одну строку и разбивает его на несколько токенов.

2
ответ дан 29 November 2019 в 02:22
поделиться

Идея Марка была хорошей, но, возможно, забыл, что в каком-то пути есть пробелы. Замена ';' вместо этого с '""' все пути будут разрезаны на строки в кавычках.

set _path="%PATH:;=" "%"
for %%p in (%_path%) do if not "%%~p"=="" echo %%~p

Итак, здесь у вас отображаются ваши пути.

Команда FOR в cmd требует утомительного обучения, особенно из-за того, как переменные реагируют внутри операторов () ... вы можете назначать любые переменные, но вы не можете читать их обратно в (), если вы не используете оператор "setlocal ENABLEDELAYEDEXPANSION" и, следовательно, также используете переменные с !! вместо %% ' s (! _var!)

В настоящее время я использую исключительно скрипт с cmd, для работы мне пришлось выучить все это :)

5
ответ дан 29 November 2019 в 02:22
поделиться

Вы должны дополнительно использовать tokens = 1,2, ... часть параметров, которые допускает цикл for . Здесь можно сделать то, что вы, возможно, захотите:

for /f "tokens=1,2,3,4,5,6,7,8,9,10,11,12 delims=;" %a in ("%PATH%") ^
do ( ^
     echo. %b ^
   & echo. %a ^
   & echo. %c ^
   & echo. %d ^
   & echo. %e ^
   & echo. %f ^
   & echo. %g ^
   & echo. %h ^
   & echo. %i ^
   & echo. %j ^
   & echo. %k ^
   & echo. ^
   & echo.   ...and now for some more... ^
   & echo. ^
   & echo. %a ^| %b ___ %c ... %d ^
   & dir "%e" ^
   & cd "%f" ^
   & dir /tw "%g" ^
   & echo. "%h  %i  %j  %k" ^
   & cacls "%f")

В этом примере обрабатываются только первые 12 токенов (= каталоги из% path%). Он использует явное перечисление каждого из используемых токенов. Обратите внимание, что имена токенов чувствительны к регистру:% a отличается от% A.

Чтобы избежать путей с пробелами, заключите все % x в кавычки типа "% i". Я не делал этого здесь, где я только повторяю жетоны.

Вы также можете делать что-то. вот так:

for /f "tokens=1,3,5,7-26* delims=;" %a in ("%PATH%") ^
do ( ^
     echo. %c ^
   & echo. %b ^
   & echo. %a ^
   & echo. %d ^
   & echo. %e ^
   & echo. %f ^
   & echo. %g ^
   & echo. %h ^
   & echo. %i ^
   & echo. %j ^
   & echo. %k )

Этот пропускает токены 2,4,6 и использует небольшой ярлык (« 7-26 »), чтобы назвать остальные из них. Обратите внимание, как на этот раз% c,% b,% a обрабатываются в обратном порядке и как они теперь «означают» разные токены по сравнению с первым примером.

Так что это определенно не то краткое объяснение, о котором вы просили. Но, возможно, теперь примеры помогут прояснить ситуацию немного лучше ...

2
ответ дан 29 November 2019 в 02:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: