Подождите, пока файл закончит запись перед выполнением следующего скрипта [duplicate]

Если вы хотите ДОБАВИТЬ НЕКОТОРЫЙ ТЕКСТ В КОНКРЕТНЫХ ЛИНИЯХ, вы можете сначала прочитать весь файл, добавить текст туда, где хотите, а затем перезаписать все, как в приведенном ниже коде:

  public static  void addDatatoFile (String data1, String data2) {String fullPath = "/home/user/dir/file.csv";  Файл dir = новый файл (fullPath);  Список & л; Строка & GT;  l = новый LinkedList & lt; String & gt; ();  try (BufferedReader br = new BufferedReader (новый FileReader (dir))) {Строка;  int count = 0;  while ((line = br.readLine ())! = null) {if (count == 1) {// добавить данные в конце второй строки строки = = data1;  } else if (count == 2) {// добавить другие данные в конце третьей строки + = data2;  } l.add (строка);  подсчитывать ++;  } br.close ();  } catch (FileNotFoundException e) {e.printStackTrace ();  } catch (IOException e) {e.printStackTrace ();  } createFileFromList (l, dir);  } public static void createFileFromList (List & lt; String & gt; list, File f) {PrintWriter writer;  try {writer = new PrintWriter (f, "UTF-8");  for (String d: list) {writer.println (d.toString ());  } writer.close ();  } catch (FileNotFoundException | UnsupportedEncodingException e) {e.printStackTrace ();  }}  
153
задан SteveC 11 January 2012 в 18:37
поделиться

7 ответов

Как правило, для внутренних команд PowerShell ожидает до следующей команды. Единственным исключением из этого правила является внешняя подсистема под управлением ОС Windows. Первый трюк заключается в том, чтобы конвейер Out-Null был следующим:

Notepad.exe | Out-Null

PowerShell будет ждать, пока процесс Notepad.exe не будет завершен до продолжения. Это изящный, но тонкий, чтобы забрать от чтения код. Вы также можете использовать Start-Process с параметром -Wait:

Start-Process <path to exe> -NoNewWindow -Wait

Если вы используете версию расширения сообщества PowerShell, это:

$proc = Start-Process <path to exe> -NoWindow
$proc.WaitForExit()

Еще одна опция в PowerShell 2.0 заключается в использовании фонового задания:

$job = Start-Job { invoke command here }
Wait-Job $job
Receive-Job $job
263
ответ дан Keith Hill 16 August 2018 в 05:24
поделиться
  • 1
    Виноват. Start-Process -Wait отлично работает, но теперь я вижу, что это не то, что я искал ... Я на самом деле пытаюсь подождать, пока vm не закончит загрузку. Я предполагаю, что это будет сложно. Полагаю, мне придется найти для этого новую тему. Спасибо, но. – John Mee 20 November 2009 в 01:37
  • 2
    Блестящий, | out-null сделал именно то, что мне было нужно. Пробовал использовать Start-Job, но поскольку я передаю результаты функций в качестве параметров, у меня получилось немного скицитоида, поэтому я не мог использовать последнее предложение ... – jcolebrand 11 September 2012 в 17:19
  • 3
    В качестве побочного примечания, если вам нужно передать несколько аргументов с помощью -ArgumentList, разделите их запятыми, например -ArgumentList /D=test,/S. – sschuberth 4 September 2015 в 13:05
  • 4
    Спасибо за простой & quot; путь к exe & gt; | Из-Null & Quot; решение! Проблема с «начальным процессом» и «путь к exe & gt; -NoNewWindow -Wait & quot; метод заключается в том, что PowerShell приостанавливается до тех пор, пока все дочерние процессы, порожденные родителем, не будут завершены, даже если родитель завершает их перед ними. Это вызвало проблемы с нашей программой установки. – zax 3 April 2018 в 21:22
  • 5
    Это то, что я использую для ожидания запуска виртуальной машины Start-AzureRmVM -ResourceGroupName $ ResourceGroupName -Name $ VmName while ((Get-AzureRmVM -ResourceGroupName $ ResourceGroupName -Name $ VmName -Status | `select -ExpandProperty Statuses |`? {$ _.Code -match «PowerState»} | `select -ExpandProperty DisplayStatus) -ne« Работа с виртуальной машиной ») {Start-Sleep -s 2} Start-Sleep -s 5 ## Дайте VM время подойти, чтобы оно может принимать удаленные запросы – andrewmo 16 July 2018 в 12:08

Кроме использования Start-Process -Wait, вывод строки исполняемого файла заставит Powershell ждать. В зависимости от необходимости я обычно буду обращаться к Out-Null, Out-Default, Out-String или Out-String -Stream. Здесь - длинный список некоторых других параметров вывода.

# Saving output as a string to a variable.
$output = ping.exe example.com | Out-String

# Filtering the output.
ping stackoverflow.com | where { $_ -match '^reply' }

# Using Start-Process affords the most control.
Start-Process -Wait SomeExecutable.com

Мне не хватает операторов стиля CMD / Bash, на которые вы ссылались (& amp ;, & amp; & amp ;, ||). Кажется, мы должны быть более подробными с Powershell .

38
ответ дан Community 16 August 2018 в 05:24
поделиться
  • 1
    Это невероятно хорошее решение, если вам нужно разбирать выходные данные! – Jan Rothkegel 17 January 2018 в 07:27

Просто используйте «Wait-process»:

"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dir

задание выполнено

9
ответ дан Flaviofire 16 August 2018 в 05:24
поделиться

Некоторые программы не могут обрабатывать выходной поток очень хорошо, использование pipe в Out-Null может не блокировать его. А для Start-Process переключатель -ArgumentList нужен для передачи аргументов, что не так удобно. Существует и другой подход.

$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)
5
ответ дан Igor Popov 16 August 2018 в 05:24
поделиться
  • 1
    как работают несколько аргументов в этом вызове? как они ограничены? как можно обрабатывать различные вложенные строки? ти! – AnneTheAgile 14 January 2015 в 00:00
  • 2
    @AnneTheAgile doc использовать пробел для разделения аргументов, для того, чтобы char escaping использовал обратную косую черту – ifree 14 January 2015 в 06:35
  • 3
    ty @ifree, я получил testcomplete, чтобы запустить этот путь! Я использовал одинарные кавычки в списке аргументов, разделенных пробелами. [1]; но теперь echo $ exitcode = false, который не был моим кодом возврата из процесса? [1] $ exitCode = [Diagnostics.Process] :: Пуск (c: \ Program Files (x86) \ SmartBear \ TestComplete 10 \ Bin \ TestComplete.exe & quot ;, & quot; c: \ Users \ ME \ Documents \ TestComplete 10 Projects \ hig4TestProject1 \ hig4TestProject1.pjs & quot; / run / project: myProj / test: & quot; KeywordTests | zTdd1_Good "/ exit ') .WaitForExit (60) – AnneTheAgile 21 January 2015 в 15:15

Принимая это дальше, вы можете даже анализировать на лету

, например

& "my.exe" | %{
    if ($_ -match 'OK')
    { Write-Host $_ -f Green }
    else if ($_ -match 'FAIL|ERROR')
    { Write-Host $_ -f Red }
    else 
    { Write-Host $_ }
}
0
ответ дан Justin 16 August 2018 в 05:24
поделиться

Если вы используете Start-Process <path to exe> -NoNewWindow -Wait

Вы также можете использовать опцию -PassThru для выхода эха.

5
ответ дан Sandy Chapman 16 August 2018 в 05:24
поделиться

Включение опции -NoNewWindow дает мне ошибку: Start-Process : This command cannot be executed due to the error: Access is denied.

Единственный способ заставить его работать:

Start-Process <path to exe> -Wait
2
ответ дан twasbrillig 16 August 2018 в 05:24
поделиться
Другие вопросы по тегам:

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