Попытка запустить chkdsk на c: \ автоматически - PullRequest
0 голосов
/ 10 мая 2019

Попытка запустить chkdsk на всех дисках компьютера. Возникли проблемы с C: \ start вообще.

Попытка использовать SendKeys для ответа «Хотите ли вы запланировать проверку этого тома при следующем перезапуске системы? (Y / N)», но безуспешно. Куда я иду не так?

$host.ui.RawUI.WindowTitle = "BOHCdrivefix"

$FixCDrive = Start-Job -Name cDriveFix -ScriptBlock {chkdsk c:/f} 
$wshell = New-Object -ComObject wscript.shell;
$wshell.AppActivate('BOHCdrivefix')
sleep 3
$wshell.SendKeys('y') 
$wshell.SendKeys('~')
wait-job $FixCDrive
Receive-Job $FixCDrive | Out-File -FilePath D:\temp\cDriveFix.txt
shutdown -r -f -t 0

Я хотел бы ответить на вопрос Y, затем выключить ПК и запустить chkdsk

.

1 Ответ

0 голосов
/ 11 мая 2019

С Start-Job документ :

Командлет Start-Job запускает фоновое задание Windows PowerShell на локальном компьютере.

Фон Windows PowerShellзадание запускает команду без взаимодействия с текущим сеансом .

Следовательно, вы не можете отправить какой-либо ключ из текущего сеанса команде, выполняющейся внутри фонового задания.Отправка ключа должна быть внутри фоновой работы.К счастью, chkdsk.exe принимает использование оператор конвейера (который отправляет результаты предыдущей команды следующей команде) следующим образом:

$FixCDrive = Start-Job -Name cDriveFix -ScriptBlock {Write-Output 'y'|chkdsk.exe c:/f}

или (используя echo псевдоним для Write-Output командлет):

$FixCDrive = Start-Job -Name cDriveFix -ScriptBlock {echo 'y'|chkdsk.exe c:/f}

Обратите внимание :

The type of the file system is NTFS.
Cannot lock current drive.

Chkdsk cannot run because the volume is in use by another
process.  Would you like to schedule this volume to be
checked the next time the system restarts? (Y/N)

Чтобы ответить «да» на вопрос, заданный chkdsk c:/f ( исправить ошибки файловой системы в загрузочном разделе ), необходимо нажать Y , , затем Enter ,

Честно говоря, я не уверен, отправляет ли Write-Output командлет Введите в конвейер.Если нет, форсировать вывод новой строки следующим образом:

Write-Output "y$([System.Environment]::NewLine)"|chkdsk.exe c:/f}
...