我正在尝试将许可证文件复制到所有域加入计算机,而且我只能使用PowerShell。GPO甚至(GPO)计划的任务是不做的,因为在Server 2003环境中,这些任务似乎尚不可能。有关的应用程序已经安装,只有许可证文件才需要覆盖。
我希望实现: - 检查是否在线,否则跳过 - 检查32B文件夹位置(如果存在),请复制,否则跳过 - 检查64B文件夹位置,如果存在复制,则跳过 - 将每个计算机的结果写入日志文件,以便我可以修剪成功
第一次尝试;
我当前有:
$computers = gc "c:tempcomputers.txt" $source = "c:tempalmmodule.lic" $dest32b = 'c$program files (x86)ALM - Automatic Login Module' $dest64b = 'c$program filesALM - Automatic Login Module' $TestPath32 = Test-Path -path "\$computer$dest32b*" $TestPath64 = Test-Path -path "\$computer$dest64b*" foreach ($computer in $computers) { if (test-Connection -Cn $computer -quiet) { IF (!$TestPath32) { Copy-Item $source -Destination "\$computer$dest32b" -recurse -force -verbose} ELSE { "$computer' 32b folder not found. Skipping"} IF (!$TestPath64) { Copy-Item $source -Destination "\$computer$dest64b" -recurse -force -verbose} ELSE {"$computer 64b folder not found. Skipping"} ELSE { "$computer is not online" } } }
我已经尝试了一些较小的变体,但是我似乎无法到达任何地方。 还需要创建记录需求。
使用自己作为测试目标,在变量上方运行并使用单个命令;
在返回:true
复制项目$ source -destination" $ Computer $ dest32b" -Recurse -force -verbose
成功,并复制文件
目前运行PowerShell抱怨最后的其他语句。
但是,大多数情况下,它没有意识到我没有64B文件夹,并且它要么给出错误,要么将文件放置为文件,该目录是文件名。
我很茫然,现在尝试了很多事情,我害怕制动我所拥有的一点。
第二尝试;
我已经编辑了代码并评论了一些部分,只是为了获得一个工作>模型以从那里进步。
foreach ($computer in $computers) { $TestPath32 = Test-Path "\$computer$dest32b*" $TestPath64 = Test-Path "\$computer$dest64b*" # if (test-Connection -Cn $computer -quiet) { IF (!$TestPath32) { Copy-Item $source -Destination "\$computer$dest32b" -recurse -force -verbose} ELSE {"$computer' 32b folder not found. Skipping"} IF (!$TestPath64) { Copy-Item $source -Destination "\$computer$dest64b" -recurse -force -verbose} ELSE {"$computer 64b folder not found. Skipping"} # ELSE { # "$computer is not online" # } #} }
现在返回:
PS C:windowssystem32> C:TempALM 2016 LIC copy.ps1 L2016010' 32b folder not found. Skipping VERBOSE: Performing operation "Copy File" on Target "Item: C:tempalmmodule.lic Destination: \L2016010c$program filesALM - Automatic Login Module". Copy-Item : De syntaxis van de bestandsnaam, mapnaam of volumenaam is onjuist. At C:TempALM 2016 LIC copy.ps1:14 char:12 + Copy-Item <<<< $source -Destination "\$computer$dest64b" -force -verbose} + CategoryInfo : NotSpecified: (:) [Copy-Item], IOException + FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.CopyItemCommand
我可以向您保证,我确实有32B路径。复制项目不放置文件。 显然,我没有64B路径,我觉得它会破裂,而不仅仅是整齐地返回$ false。
当我与He路径陷入困境时(因为我认为这是失败的原因),有时会在名为" ALM-自动登录模块"的程序文件中放置A file ,这是大小许可证文件。
再次,如果我将行
Copy-Item $source -Destination "\$computer$dest32b"
作为独立运行,它确实会复制文件。
第三尝试,现在正在工作;
$computers = gc "c:tempcomputers.txt"
$source = "c:tempalmmodule.lic"
$dest32b = 'c$program files (x86)ALM - Automatic Login Module'
$dest64b = 'c$program filesALM - Automatic Login Module'
foreach ($computer in $computers) {
$TestUp = test-Connection -Cn $computer -quiet
$TestPath32 = Test-Path -pathType container "\$computer$dest32b"
$TestPath64 = Test-Path -pathType container "\$computer$dest64b"
IF (!$TestUp) {
write-host "$computer is not online"
} ELSE {
IF (!$TestPath32){
write-host "$computer' 32b folder not found. Skipping"
} ELSE {
Copy-Item $source -Destination "\$computer$dest32b" -force -verbose
}
IF (!$TestPath64){
write-host "$computer 64b folder not found. Skipping"
} ELSE {
Copy-Item $source -Destination "\$computer$dest64b" -force -verbose
}
}
}
使用!$完全笼罩着我的头,我应该从以下方面工作
如果没有,则
现在,脚本跳过了不存在的脚本,还无法测试计算机,但我认为现在也有效。
现在我需要弄清楚的是如何以可读格式将输出记录到1个日志文件中
在使用GPO或计划任务时会更好,或者如果有的话,可能会与SCCM部署, is 在您的约束中答案。您已经有了正确的基本想法,但是将$TestPath32
和$TestPath64
的作业移动到foreach
循环中:
...
foreach ($computer in $computers) {
if (test-Connection -Cn $computer -quiet) {
$TestPath32 = Test-Path -path "\$computer$dest32b*"
$TestPath64 = Test-Path -path "\$computer$dest64b*"
IF (!$TestPath32) {
...
i我投票 gpo ,如评论中所述,您绝对应该考虑。
但是,如果对您没有帮助,您的$ TESTPATH32&amp;在分配单个计算机值之前,请评估$ TESTPATH64变量。我会简单地无效,因此两者都是$ false。您只需将它们移入循环中,
foreach ($computer in $computers) {
if (test-Connection -Cn $computer -quiet) {
$TestPath32 = Test-Path -path "\$computer$dest32b*"
$TestPath64 = Test-Path -path "\$computer$dest64b*"
......
}
另一方面,我希望您已将文件的内容格式化以返回数组。如果不是,您简单地用"划分了它,然后阅读文件内容:Computer1,Computer2,Computer3
并将文件直接读取为数组
$computers = Get-Content 'c:tempcomputers.txt' # It will read it as an array only. YOu do not need any additional formatting in this case.
最终版本。无法像我想要的那样跑得超越。
借用了启动转录。必须在结束时放置及格,以将输出格式化为可读的内容。
#set-executionpolicy RemoteSigned
$computers = gc "c:tempcomputers.txt"
$source = "c:tempalmmodule.lic"
$dest32b = 'c$program files (x86)ALM - Automatic Login Module'
$dest64b = 'c$program filesALM - Automatic Login Module'
Start-Transcript -path C:tempALM-Log.txt -append
foreach ($computer in $computers) {
$TestUp = test-Connection -Cn $computer -quiet
$TestPath32 = Test-Path -pathType container "\$computer$dest32b"
$TestPath64 = Test-Path -pathType container "\$computer$dest64b"
IF (!$TestUp) {
write-host "$computer is not online`r"
} ELSE {
IF (!$TestPath32){
write-host "$computer' 32b folder not found. Skipping`r"
} ELSE {
Copy-Item $source -Destination "\$computer$dest32b" -force -verbose
}
IF (!$TestPath64){
write-host "$computer 64b folder not found. Skipping`r"
} ELSE {
Copy-Item $source -Destination "\$computer$dest64b" -force -verbose
}
}
}
Stop-Transcript
$log = Get-Content C:tempALM-Log.txt
$log > c:tempALM-Log.log
有关此原因的实际解决方案= Test-Path -pathtype container