Передавать файлы один за другим скрипту python (XARGS на windows? FORFILES?) [Дублировать]

Еще одно отличие для добавления относится к синхронизации потоков.

ArrayList обеспечивает некоторую безопасность потоков через свойство Synchronized, которое возвращает потокобезопасную оболочку вокруг коллекции. Обертка работает, блокируя всю коллекцию при каждой операции добавления или удаления. Поэтому каждый поток, пытающийся получить доступ к коллекции, должен дождаться, пока его очередь займет один замок. Это не является масштабируемым и может привести к существенному ухудшению производительности для больших коллекций.

List не обеспечивает синхронизации потоков;

blockquote>

Дополнительная информация здесь Синхронизация потоков в .Net Framework

3
задан Community 23 May 2017 в 12:21
поделиться

3 ответа

Это кажется ошибкой в ​​способе forfiles вызывает .exe s. По какой-то причине я расширил мою программу debugargs, чтобы напечатать полную командную строку.

X:\MyProject>forfiles /m "*.tt" /s /c "debugargs.exe 1 2 @file"

2 arguments supplied
#1: 2
#2: Urls.tt
Full command line: 1 2 "Urls.tt"

Таким образом, наиболее подходящим обходным решением было бы удвоить исполняемое имя:

forfiles /m "*.tt" /s /c "debugargs.exe debugargs.exe 1 2 @file"

Альтернативное обходное решение - вызвать cmd /c. Однако обратите внимание, что если вам нужно указать путь исполняемого файла (например, поскольку он содержит пробел), вам понадобится дополнительное обходное решение для добавления @:

forfiles /m "*.tt" /s /c "cmd /c @\"debugargs.exe\" 1 2 @file"
3
ответ дан Peter Taylor 19 August 2018 в 10:36
поделиться
  • 1
    Какова цель здесь @? Я хотел использовать FORFILES с контуром исполняемого файла, содержащим пробелы, и не смог заставить его работать. Это похоже на символ @, который позволил использовать \", который я уже пробовал, но без @ и без успеха. Есть ли место, где я мог бы получить дополнительную информацию об этом свойстве? благодаря – simpLE MAn 11 September 2017 в 19:17
  • 2
    Извините, я не помню. Я вообще не использую cmd: для предпочтения я использую cygwin bash. – Peter Taylor 11 September 2017 в 21:05

Я воспроизвел поведение и в файлах. Вы можете обойтись, используя команду cmd / c перед командой, или вы можете перейти к PowerShell, где эквивалентная команда будет примерно такой (не проверена):

get-childitem . -filter "*.tt" -recurse | foreach-object {
  & "${ENV:CommonProgramFiles(x86)}\Microsoft Shared\TextTemplating\1.2\TextTransform.exe" "`"$($_.Name)`""
}

Bill

0
ответ дан Bill_Stewart 19 August 2018 в 10:36
поделиться
  • 1
    Я не думаю, что PowerShell является вариантом (если я не вызываю его из cmd), потому что VS2008 сбрасывает команду, которую я передаю в исполняемый файл. – Peter Taylor 4 April 2013 в 18:55

Я тоже борюсь с этим. Обход, который я нашел, - это просто добавить дополнительное пространство между командой и первым аргументом! Итак, где я пытался:

FORFILES /s /m *.dll /c "python \"c:\path\to\script.py\" -t arg1 etc"

python пытался найти файл «arg1» для выполнения, но если бы я просто изменил его на:

FORFILES /s /m *.dll /c "python  \"c:\path\to\script.py\" -t arg1 etc"

, это на самом деле работает!

0
ответ дан jamieg 19 August 2018 в 10:36
поделиться
Другие вопросы по тегам:

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