57659


batファイルでBox上のドライブにあるファイルをローカルにダウンロードさせる際、ローカルに既に同じファイルがあった場合にコマンドプロンプトでY/nの入力を求められたまま終了しません。  
Powershellからbox cliのコマンドをたたくbatファイルをstart-processで実行しようとしています。  
実行はできるし、エラーが起きた場合にはきちんと検知して終了します。  
Powershell側が終了したら、コマンドプロンプトも終了させるにはどうしたらいいでしょうか。

bat ↓

[code]

    Box files:download [ファイルID] --destination [ダウンロード先]
    
[/code]


CC BY-SA 4.0
2019-08-28T10:05:54.080
57658
2019-08-28T13:09:06.597
33013
question
powershell コマンドプロンプト
コマンドプロンプトを終了させたい


ちなみに、事後の対策を考える前に、そもそもダウンロード先に既にファイルが存在するかどうかを事前にチェックして実行する/しないを制御すれば良いのでは？

[PowerShell/ファイル・フォルダの存在チェック・Test-
Path](https://win.just4fun.biz/?PowerShell/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%BB%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE%E5%AD%98%E5%9C%A8%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%BBTest-
Path) / [Test-Path](https://docs.microsoft.com/en-
us/powershell/module/microsoft.powershell.management/test-path)

box側のファイル名情報は、これらのAPIで取得出来るのでは？  
[box files:get
ID](https://github.com/box/boxcli/blob/master/docs/files.md#box-filesget-id) /
[box folders:items
ID](https://github.com/box/boxcli/blob/master/docs/folders.md#box-
foldersitems-id)  
[Ordering of get folder items API
call](https://stackoverflow.com/q/19547380/9014308)

* * *

上書きして問題ないなら -y オプションが指定出来るのでは？

[box files:download
ID](https://github.com/box/boxcli/blob/master/docs/files.md#box-filesdownload-
id)

> -y, --yes Automatically respond yes to all confirmation prompts

* * *

この辺の記事にあるように、開始時にプロセスの情報を取得しておき、強制終了が必要になったら、そのプロセス情報を指定して終了させれば良いのではないでしょうか。

[【Start-Process】PowerShellで別プロセスを起動させる方法](https://cheshire-
wara.com/powershell/ps-cmdlets/system-service/start-process/) / [Start-
Process](https://docs.microsoft.com/en-
us/powershell/module/microsoft.powershell.management/start-process)  
[【Stop-Process】PowerShellでプロセスを強制終了させる方法とは？](https://cheshire-
wara.com/powershell/ps-cmdlets/system-service/stop-process/) / [Stop-
Process](https://docs.microsoft.com/en-
us/powershell/module/microsoft.powershell.management/stop-process)

  * Start-Process に -PassThru オプションを指定してプロセス情報の戻り値を変数($ChildInfo等)に格納しておく
  * 強制終了が必要になったら、格納しておいたプロセス情報そのものを指定(-InputObject $ChildInfo等)するか、その中のプロセスID情報を指定(-Id $ChildInfo.Id等)し、必要ならば強制終了(-Force)のオプションも指定して終了させる

終了させようとした子プロセスがさらに子プロセスを持っている場合、それらは終了しないので、以下の記事の回答のようなプロセスツリーをたどって終了させていく方法を取る必要があるでしょう。  
**(注:こちらは試していないので実験してみてください)**

[Terminate process tree in PowerShell given a process
ID](https://stackoverflow.com/q/55896492/9014308)

> So I couldn't really find a good way to do this, so I wrote a helper
> function that uses recursion to walk down the process tree:
>
> そのため、これを行う良い方法を見つけることができなかったため、再帰を使用してプロセスツリーをたどるヘルパー関数を作成しました。
[code]

>     function Kill-Tree {
>         Param([int]$ppid)
>         Get-CimInstance Win32_Process | Where-Object { $_.ParentProcessId
> -eq $ppid } | ForEach-Object { Kill-Tree $_.ProcessId }
>         Stop-Process -Id $ppid
>     }
>  
[/code]

>
> To use it, put it somewhere in your PowerShell script, and then just call it
> like so:
>
> 使用するには、PowerShellスクリプトのどこかに配置して、次のように呼び出します。
[code]

>     Kill-Tree <process_id>
>  
[/code]


CC BY-SA 4.0
2019-08-28T11:38:33.340
57659
2019-08-28T13:09:06.597
2019-08-28T13:09:06.597
26370
26370
57658
answer