【问题标题】:Cannot overwrite variable because it is readonly无法覆盖变量,因为它是只读的
【发布时间】:2015-03-27 18:40:16
【问题描述】:

我正在尝试学习 Powershell。我有以下脚本:

$cmd = {
  param($pid)
  Write-Host $pid
}

$processes = Get-Process -Name notepad
foreach ($process in $processes) 
{ 
    $pid = $process.ID
    Start-Job -ScriptBlock $cmd -ArgumentList $pid
}

我收到以下错误:

无法覆盖变量 PID,因为它是只读的或常量。在 行:7 字符:1 + $pid = 1 + ~~~~~~~~ + CategoryInfo : WriteError: (PID:String) [], SessionStateUnauthorizedAccessException + FullyQualifiedErrorId : VariableNotWritable 无法覆盖变量 PID,因为它是只读的或常量。在行:11 字符:1 + $pid = $process.ID +~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (PID:String) [], SessionStateUnauthorizedAccessException +fullyQualifiedErrorId:VariableNotWritable Start-Job:无法覆盖变量 pid,因为它是只读的或常量。在线:12 字符:5 + Start-Job -ScriptBlock $cmd -ArgumentList $pid

我在这里做错了什么?

【问题讨论】:

    标签: windows powershell


    【解决方案1】:

    $PID 是一个 reserved, automatic variable,其中包含会话的进程 ID。你不能设置它。

    见:

    Get-Help about_Automatic_Variables 
    

    获取自动变量的完整列表和说明。

    编辑:

    输出所有记事本进程的进程ID:

     Get-Process -Name notepad |
       Select -ExpandProperty ID 
    

    【讨论】:

    • 谢谢,如果我将其更改为不同的名称,我会得到以下结果。我只想要进程ID。我怎样才能做到这一点? Id 名称 PSJobTypeName 状态 HasMoreData 位置命令 -- ---- ------------- ----- ----------- -------- ------- 2 Job2 BackgroundJob Running True localhost ... 4 Job4 BackgroundJob Running True localhost ...
    • 您需要在问题中更好地解释您要完成的工作。
    • 只是在使用函数时尝试打印所有正在运行的记事本实例的进程 ID
    • 嗯,我没有得到 PID,但这是一个不同的问题。我会发布它。
    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2019-11-24
    • 2018-12-07
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多