我在Windows 7上有一个简单的PowerShell脚本无法正常工作。 (这不是XP的问题)
get-psdrive
当我直接运行时,我得到了
Name Used (GB) Free (GB) Provider Root
---- --------- --------- -------- ----
A FileSystem A:\
Alias Alias
C 12.30 11.60 FileSystem C:\
cert Certificate \
D FileSystem D:\
Env Environment
Function Function
HKCU Registry HKEY_CURRENT_USER
HKLM Registry HKEY_LOCAL_MACHINE
**Q 1486.63 289.41 FileSystem Q:\**
Variable Variable
WSMan WSMan
当我通过任务计划程序运行时,我得到了
Name Used (GB) Free (GB) Provider Root
---- --------- --------- -------- ----
A FileSystem A:\
Alias Alias
C 12.30 11.60 FileSystem C:\
cert Certificate \
D FileSystem D:\
Env Environment
Function Function
HKCU Registry HKEY_CURRENT_USER
HKLM Registry HKEY_LOCAL_MACHINE
Variable Variable
WSMan WSMan
请注意,我错过了我的Q:驱动器。如果有任何方法可以解决这个问题,我将能够在那里复制文件....
答案 0 :(得分:6)
网络驱动器,实际上所有驱动器号都被“映射”到给定登录会话的卷。当您创建要运行的计划任务时,它会创建新的登录会话(即使您当前已登录)并在该上下文中运行计划任务。因此,虽然您可能已登录并且已映射Q驱动器 - 运行该任务的第二个会话具有完全不同的环境,但Windows足以自动映射所有会话的C :(和其他物理驱动器)。
使用PowerShell时,您不需要将地图映射到驱动器,除了方便之外。与cmd.exe的前身不同,PowerShell非常乐意将当前目录更改为UNC样式路径:
cd \\server\share\directory
是否有可能在不绘制驱动器的情况下完成所需的操作?您已经提到了复制文件 - 如果任务是使用您的凭据运行的,并且假设您拥有Q:驱动器的权限(比如说\ server \ share),那么您的脚本应该能够执行以下操作:
copy c:\logs\*.log \\server\share\logs
无需映射驱动器即可正常工作。
这是我的测试的完整命令信息。如果您的环境不同,请注意如何。该任务配置为仅在我登录时以我的域帐户身份运行,具有最高权限并为Windows 7 / Server 2008 R2配置。
动作是启动程序:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
参数
-command copy c:\logs\*.log \\server\share\logs
答案 1 :(得分:1)
也许在脚本中运行get-psdrive之前,首先要执行以下操作:
$net = new-object -comobject Wscript.Network
$net.mapnetworkdrive("Q:","\\path\to\share",0,"domain\user","password")
完成工作后(复制文件..):
$net.removenetworkdrive("Q:")
答案 2 :(得分:0)
如果您不想在脚本中输入密码,则会遭到黑客入侵,我更希望避免这种情况:
以管理员身份打开powershell,并建立从UNC到本地路径的符号链接
New-Item -ItemType SymbolicLink -Path“ C:\ LocalTemp \” -Value“ \ unc”
您现在可以直接在powershell脚本中使用UNC路径,它将使用计划任务中提供的凭据打开它。
计划任务中的凭据可能存在一些问题,但是在我看来,这比脚本中清除或伪混淆的密码要好。