PShell 脚本适用于 ISE,但在运行 .ps1 时

问题描述

我编写了一个脚本来映射网络驱动器 (NAS)(如果未映射),或者如果已映射则取消映射。

# NAS.ps1
If (!(Test-Path N:)) {
    $User = "User"
    # Pwd in script will be removed later
    $Pwd = ConvertTo-securestring -String "Password" -AsPlainText -Force
    
    $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Pwd

    New-PSDrive -Name "N" -PSProvider "FileSystem" -Root "\\192.168.1.100\NAS" -Persist -Credential $Credential
} else {
    Remove-PSDrive -Name "N"
}

我使用 Windows Powershell ISE 对其进行编辑。当我运行它时,我看到驱动器在我的 Windows 资源管理器窗口中出现或消失。太完美了。

使用 Powershell 运行

但是,当我右键单击 NAS.ps1 >“Run with Powershell”时,PS 窗口会快速出现/消失,并且驱动器既未映射也未未映射(没有任何变化)。 >

运行 Powershell,然后运行 ​​./NAS.ps1

如果我尝试运行 Powershell,使用我的脚本 cd 到文件夹,然后手动运行它,它会一直挂载驱动器:

PS C:\Users\User\Desktop> .\NAS.ps1

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
N                1150.44       3201.81 FileSystem    \\192.168.1.100\NAS

PS C:\Users\User\Desktop> .\NAS.ps1

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
N                1150.44       3201.81 FileSystem    \\192.168.1.100\NAS

管理员身份运行 Powershell,然后运行 ​​./NAS.ps1

如果我以管理员身份启动 Powershell 并运行我的脚本,则不会显示任何内容

PS C:\Windows\system32> cd C:\Users\User\Desktop
PS C:\Users\User\Desktop> .\NAS.ps1
PS C:\Users\User\Desktop> .\NAS.ps1
PS C:\Users\User\Desktop> .\NAS.ps1

使用 Get-PSDrive显示为已安装,我可以 cd 进入它,但是从 Win.资源管理器窗口没有出现

解决方法

解决方案是在映射驱动器时使用 -Scope Global,并使用 net use 取消映射。

工作代码:

# NAS
Set-StrictMode -Version 2.0
If (!(Test-Path N:)) {

    $User = "user"
    $Pswd = ConvertTo-SecureString -String "Password" -AsPlainText -Force

    $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Pswd

     New-PSDrive -Name "N" -Root "\\192.168.1.100\NAS" -Credential $Credential -PSProvider "FileSystem" -Persist -Scope Global
} else {
    Net Use "N:" /delete
}
,

好的,第一个问题是否设置了执行策略?

默认情况下,不允许执行脚本。

您可以使用此 cmdlet 来完成。

MarshalXML()

第二个看起来不好的东西是 $pwd $pwd,定义当前路径的系统默认变量。 更好的用户 $Pass 或 $Pword 或 $Pswd 等

最后一个问题,你在做什么这个 New-PSDrive?

我为什么要问。因为据我所知,PSDrive 仅针对当前的 PowerShell 会话进行映射。这不会像映射驱动器那样显示驱动器。您可以使用它来复制文件或执行操作。但是当您关闭此 PowerShell 会话时,映射将被删除。

这与“净使用”不同 你实际上可以这样做

# To configure execution policy
Set-ExecutionPolicy -ExecutionPolicy Unrestricted

# To check execution policy
Get-ExecutionPolicy -List

还是旧的时尚方式:

$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive("n:","\\192.168.1.100\NAS",$false,$User,$password)