首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PShell脚本在ISE中工作,但当运行.ps1时

PShell脚本在ISE中工作,但当运行.ps1时
EN

Stack Overflow用户
提问于 2021-07-10 10:17:07
回答 2查看 261关注 0票数 2

我写了一个脚本来映射一个网络驱动器(NAS),如果没有映射,或者如果映射了,就取消映射。

代码语言:javascript
复制
# 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运行

但是,当我右键单击NAS.ps1 >“right”时,PS窗口会迅速出现/消失,驱动器既不会被映射/取消映射(什么都不会改变)。

那么运行Powershell ./NAS.ps1

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

代码语言:javascript
复制
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运行为Admin . /NAS.ps1

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

代码语言:javascript
复制
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进入它,但从胜利。窗口,它不会出现

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-10 14:47:20

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

工作代码:

代码语言:javascript
复制
# 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
}
票数 3
EN

Stack Overflow用户

发布于 2021-07-10 12:09:30

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

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

你可以用这个cmdlet做这件事。

代码语言:javascript
复制
# To configure execution policy
Set-ExecutionPolicy -ExecutionPolicy Unrestricted

# To check execution policy
Get-ExecutionPolicy -List

第二件看起来很糟糕的事情是$pwd $pwd,这是一个定义当前路径的系统默认变量。更好的用户$Pass或$Pword或$Pswd等。

最后一个问题,你在做什么新的-PSDrive?

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

这与“网络使用”不同,实际上您可以这样做

代码语言:javascript
复制
$net = new-object -ComObject WScript.Network
$net.MapNetworkDrive("n:", "\\192.168.1.100\NAS", $false, $User, $password)

或者旧的时尚方式:

代码语言:javascript
复制
$script = 'net use N: \\192.168.1.100\NAS /persistent:yes /u:' + $User + ' ' + $Password
Invoke-Expression $script
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68326782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档