如何在PowerShell中通过PIP一行升级过时的Python包?
几天前,我在 pypa / pip 中创建了一个问题,询问为什么包名称无法在 PowerShell 中作为对象传递
pip list --outdated | Select-Object Package
开发商建议使用
py -m pip list --outdated --format=json | ConvertFrom-JSON
现在看来
((pip list --outdated --format=json | ConvertFrom-JSON).name | Out-String).replace("`r`n"," ")
输出过时的包在空间中分裂:
idna ipykernel ipython jedi jupyter-client jupyterlab jupyterlab-server lxml Pillow setuptools```
pip install ((pip list --outdated --format=json | ConvertFrom-JSON).name | Out-String).replace("`r`n"," ")
不起作用:
错误:无效要求:'idna ipykernel ipython jedi jupyter-client jupyterlab jupyterlab-server lxml Pillow setuptools'
但是,如果我使用
Write-Output
:
Write-Output "pip install -U" ((pip list --outdated --format=json | ConvertFrom-JSON).name | Out-String).replace("`r`n"," ")
它输出
pip install -U
idna ipykernel ipython jedi jupyter-client jupyterlab jupyterlab-server lxml Pillow setuptools
被分成两行,无法通过
Invoke-Expression
执行。
如果我使用
Write-Host
:
Write-Host "pip install -U" ((pip list --outdated --format=json | ConvertFrom-JSON).name | Out-String).replace("`r`n"," ") | Invoke-Expression
只是正常输出,但不执行:
pip install -U idna ipykernel ipython jedi jupyter-client jupyterlab jupyterlab-server lxmlPillow setuptools```
用两行来完成此操作是可以接受的:
$od = ((pip list --outdated --format=json | ConvertFrom-JSON).name | Out-String).replace("`r`n"," ")
Write-Output "pip install -U $od" | Invoke-Expression
但是,出于我的好奇,这可以写成一行吗?
我一直忘记如何执行此操作,因此我将命令粘贴到此处作为备忘录:
pip install -U (pip list --outdated --format=json | ConvertFrom-JSON | ForEach {$_.name})
在 PowerShell 7.4.1 上测试。