VBScript Environment Variable %COMPUTERNAME%

3

我需要关于环境变量%COMPUTERNAME%的帮助。它在我的脚本中用作根据本地主机名命名文件的手段。在另一个时间点,我使用该脚本在不同目录(到映射的驱动器)上通过网络构建文件夹,并且需要以原始计算机的本地主机名命名文件夹。这可能没有意义,但我将在下面提供示例:

Comp1 = BobPC
Comp2 = JakePC

我正在BobPC上制作一个zip文件,然后将其复制到JakePC上,但我需要将此文件复制到类似于C:\CopiedFiles\BobPc的目录中,因为该脚本将在许多计算机上运行,并且每台计算机都需要一个以其名称命名的文件夹来存放文件。
目前,我可以很好地构建文件夹,但它将其命名为"JakePC"的名称,这显然是因为我使用环境变量来获取本地主机名。
我的问题基本上是如何告诉它以原始计算机命名文件夹?
如果您有任何问题,请让我知道,我将非常乐意解释,因为我知道我可能没有表达清楚。

你能更具体地说明你的问题吗?比如:如何创建文件夹,如何在远程计算机上工作,或者如何获取计算机名称。 - Jay
脚本正在一台计算机上运行,并在另一台计算机上生成一个文件夹,但我需要该文件夹的名称是运行脚本的计算机的主机名。 - parchambeau
你可以从 %COMPUTERNAME% 环境变量中获取主机名。该变量始终是源文件所在的本地主机名,因为脚本始终在本地运行。如果脚本在“JakePC”上运行,则它将在远程计算机上生成一个名为“JakePC”的文件夹,就像您在帖子中已经说明的那样。或者您是想使用远程主机名来命名文件夹吗? - Jay
是的,我可以顺利生成文件夹。我的做法是让它在本地机器上用主机名创建文件夹,然后再将其传输到远程机器上进行压缩或复制。但当我尝试使用计算机名称环境变量来复制本地压缩文件时,出现了问题,无法识别路径。因此,复制就无法正确完成。 - parchambeau
可能是Can I pick up environment variables in vbscript WSH script?的重复问题。 - user692942
显示剩余2条评论
2个回答

6

如果您从源计算机运行脚本,可以使用以下方法:

dim oFso, oShell, oShellEnv, computerName, target, source
const overwrite = true
set oFso      = CreateObject("Scripting.FileSystemObject")
set oShell    = WScript.CreateObject("WScript.Shell")
set oShellEnv = oShell.Environment("Process")
computerName  = oShellEnv("ComputerName")
source =  "c:\test\yourZip.zip"
target = "\\JakePC\copiedFiles\" & computerName & ".zip"
'copiedFiles needs to be a share with write permission for the user who runs the script
oFso.CopyFile source, target, overwrite
'do check on errors and the cleanup of your objects

如果您要从目标PC运行它,您应该使用远程脚本,但这并不聪明,因为您必须知道需要运行它的计算机的名称,所以没有必要使用环境变量。


oFso.CopyFile(source, target, overwrite) - 语法错误1044,'调用Sub时不能使用括号' - Ekkehard.Horner
无法测试这个,如果是这种情况,请删除括号或在其前面调用,我会适应答案,谢谢Ekkehard。 - peter
谢谢您的回复。我已经成功让脚本运行了。这只是我自己在括号/引号使用上的一个“傻瓜”错误。想到自己可能有根本性的错误,真的很烦人。 - parchambeau
Peter,我能否向您发送此脚本的消息副本,您可以快速查看一下吗?这是我的第一个脚本,因此我正在尽力从中获得尽可能多的学习经验,并且对其进行良好的批判将非常有帮助。 - parchambeau
当然,但为什么不在这里发布呢?我不是唯一一个能帮助你的VBScript用户。编辑你的回答,如果太大了,就把它放在GitHub上,并在这里放一个链接。 - peter

2

我找到了两种获取主机名的代码片段。这两种方法在Windows 7 SP1和Windows Server 2012中都可以正常运行:

'
' How to get the hostname
' 
' References
'
' Method1: http://www.robvanderwoude.com/vbstech_network_names_hostname.php
' method2: https://msdn.microsoft.com/en-us/library/s6wt333f(v=vs.84).aspx

WScript.Echo "Method 1 "

Set wshShell = WScript.CreateObject( "WScript.Shell" )
strRegValue = "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Hostname"
strHostName = wshShell.RegRead( strRegValue )
WScript.Echo "Host Name: " & strHostName

WScript.Echo "Method 2  (include other network values)"

Set WshNetwork = WScript.CreateObject("WScript.Network")
WScript.Echo "Domain = " & WshNetwork.UserDomain
WScript.Echo "Computer Name = " & WshNetwork.ComputerName
WScript.Echo "User Name = " & WshNetwork.UserName

区别在于WshNetwork.ComputerName方法返回的主机名为大写形式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接