Если вы хотите ДОБАВИТЬ НЕКОТОРЫЙ ТЕКСТ В КОНКРЕТНЫХ ЛИНИЯХ, вы можете сначала прочитать весь файл, добавить текст туда, где хотите, а затем перезаписать все, как в приведенном ниже коде:
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 (); }}
Как правило, для внутренних команд 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
Кроме использования 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 .
Просто используйте «Wait-process»:
"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dir
задание выполнено
Некоторые программы не могут обрабатывать выходной поток очень хорошо, использование pipe в Out-Null
может не блокировать его. А для Start-Process
переключатель -ArgumentList
нужен для передачи аргументов, что не так удобно. Существует и другой подход.
$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)
Принимая это дальше, вы можете даже анализировать на лету
, например
& "my.exe" | %{
if ($_ -match 'OK')
{ Write-Host $_ -f Green }
else if ($_ -match 'FAIL|ERROR')
{ Write-Host $_ -f Red }
else
{ Write-Host $_ }
}
Если вы используете Start-Process <path to exe> -NoNewWindow -Wait
Вы также можете использовать опцию -PassThru
для выхода эха.
Включение опции -NoNewWindow
дает мне ошибку: Start-Process : This command cannot be executed due to the error: Access is denied.
Единственный способ заставить его работать:
Start-Process <path to exe> -Wait
| out-null
сделал именно то, что мне было нужно. Пробовал использоватьStart-Job
, но поскольку я передаю результаты функций в качестве параметров, у меня получилось немного скицитоида, поэтому я не мог использовать последнее предложение ... – jcolebrand 11 September 2012 в 17:19-ArgumentList
, разделите их запятыми, например-ArgumentList /D=test,/S
. – sschuberth 4 September 2015 в 13:05