PShell 脚本在 ISE 中有效,但当 运行 .ps1
PShell script works in ISE, but when running .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 资源管理器 window 中出现或消失。太完美了。
运行 与 Powershell
但是,当我右键单击 NAS.ps1
>“运行 with Powershell”时,PS window 很快 appear/disappear 驱动器也不是 mapped/unmapped(没有变化)。
运行 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。资源管理器window它没有出现
好的,第一个问题,如果你设置了执行策略?
默认情况下,不允许执行脚本。
您可以使用此 cmdlet 来完成。
# To configure execution policy
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
# To check execution policy
Get-ExecutionPolicy -List
第二个看起来不好的是$pwd
$pwd,定义当前路径的系统默认变量。
更好的用户 $Pass 或 $Pword 或 $Pswd 等
最后一个问题,您要使用此 New-PSDrive 做什么?
为什么我要问。因为据我所知,PSDrive 仅为当前 PowerShell 会话映射。这不会像映射驱动器那样显示您的驱动器。您可以使用它来复制文件或执行操作。但是当您关闭此 PowerShell 会话时,映射将被删除。
这与“网络使用”不同
你实际上可以这样做
$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive("n:", "\192.168.1.100\NAS", $false, $User, $password)
或者老办法:
$script = 'net use N: \192.168.1.100\NAS /persistent:yes /u:' + $User + ' ' + $Password
Invoke-Expression $script
解决方案是在映射驱动器时使用 -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
}
我写了一个脚本来映射网络驱动器 (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 资源管理器 window 中出现或消失。太完美了。
运行 与 Powershell
但是,当我右键单击 NAS.ps1
>“运行 with Powershell”时,PS window 很快 appear/disappear 驱动器也不是 mapped/unmapped(没有变化)。
运行 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。资源管理器window它没有出现
好的,第一个问题,如果你设置了执行策略?
默认情况下,不允许执行脚本。
您可以使用此 cmdlet 来完成。
# To configure execution policy
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
# To check execution policy
Get-ExecutionPolicy -List
第二个看起来不好的是$pwd $pwd,定义当前路径的系统默认变量。 更好的用户 $Pass 或 $Pword 或 $Pswd 等
最后一个问题,您要使用此 New-PSDrive 做什么?
为什么我要问。因为据我所知,PSDrive 仅为当前 PowerShell 会话映射。这不会像映射驱动器那样显示您的驱动器。您可以使用它来复制文件或执行操作。但是当您关闭此 PowerShell 会话时,映射将被删除。
这与“网络使用”不同 你实际上可以这样做
$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive("n:", "\192.168.1.100\NAS", $false, $User, $password)
或者老办法:
$script = 'net use N: \192.168.1.100\NAS /persistent:yes /u:' + $User + ' ' + $Password
Invoke-Expression $script
解决方案是在映射驱动器时使用 -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
}