2016-09-05 6 views
0

Я использую этот код в функции локального монтирования зашифрованного контейнера (используя VeraCrypt для письма I) и информировать пользователя, если он был успешным. После успешного монтирования с использованием Start-ProcessTest-Path в цикле всегда терпит неудачу, хотя тот же Test-Path возвращает True, если его попробовали в другой открытой консоли. Закончив скрипт и снова запустив Test-Path 'I:\', он возвращает True.Test-Path не обнаруживает только что смонтированный том

Почему Test-Path не видит вновь установленный том?

# mount I:\ 
Start-Process $veraCrypt '/q /v C:\Users\myuser\container.tc /tc /l I' 

# wait 60seconds for mounting 
for ($i = 0; $i -lt 60; $i++) 
{ 
    # if I mounted, do other things 
    if (Test-Path 'I:\') 
    { 
     "mounted!" 

     break; 
    } 
    else 
    { 
     # if not yet mounted, wait 
     "not yet... $($i)/60" 

     Start-Sleep -Seconds 1 
    } 
} 
+0

Я бы удалил цикл for ... поставил 'start-sleep -minutes 1' перед тем, как я проверил путь и посмотрю, работает ли он. – Kiran

+4

Есть ли какая-то особая причина, почему вы запускаете '$ veraCrypt' асинхронно? Если нет, я бы рекомендовал использовать 'Start-Process -Wait' или (еще лучше) оператор вызова (' & '). –

+0

@AnsgarWiechers работает с -Wait. Хотелось запустить асинхронно, чтобы запустить другие задачи в фоновом режиме, но я найду другой путь. –

ответ

0

Возможно, монтаж займет больше времени, чем вы ждали (хотя я бы ожидал, что хватит 60 секунд). Если асинхронное выполнение не является обязательным требованием, я бы запустить команду синхронно, либо путем добавления параметра -Wait

Start-Process $veraCrypt '/q /v C:\Users\myuser\container.tc /tc /l I' -Wait 

или с помощью call operator

& "$veraCrypt" /q /v C:\Users\myuser\container.tc /tc /l I 

Если вы хотите придерживаться асинхронного исполнения, то при for цикл не лучший подход, когда вы не знаете количество циклов цикла заранее. Обычно лучше сделать что-то вроде этого:

$limit = (Get-Date).AddMinutes(5) 
do { 
    Start-Sleep -Seconds 5 
} until ((Test-Path 'I:\') -or (Get-Date) -gt $limit) 
+0

Монтаж занимает всего 10-15 секунд (включая запись пароля). Я использовал для цикла, чтобы автоматически останавливаться через некоторое время (например, нет, чтобы блокировать что-то неопределенно в случае отсутствия ввода). Что действительно меня беспокоит, почему путь не найден, даже если он предназначен для других оболочек (или после этой функции). –