3

我在 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: 驱动器。如果有任何方法可以解决这个问题,我将能够在那里复制文件....

4

3 回答 3

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
于 2010-11-02T19:17:02.863 回答
1

也许在脚本中运行 get-psdrive 之前,首先做这样的事情:

$net = new-object -comobject Wscript.Network
$net.mapnetworkdrive("Q:","\\path\to\share",0,"domain\user","password")

在完成你的工作(复制文件..)之后:

$net.removenetworkdrive("Q:")
于 2010-11-04T14:00:08.430 回答
0

如果您不想在脚本中使用密码,则有一个 hack,我更愿意避免:

  • 以足够的权限打开您的文件夹(例如域用户)
  • 以管理员身份打开 powershell 并创建从 UNC 到本地路径的符号链接

    新项目 -ItemType SymbolicLink -Path "C:\LocalTemp\" -Value "\unc"

  • 您现在可以直接在 powershell 脚本中使用 UNC 路径,它将使用计划任务中提供的凭据打开它。

计划任务中的凭据可能存在一些问题,但是在我看来,这仍然比脚本中明文或伪混淆的密码更好。

于 2019-12-18T06:17:00.327 回答