PowerShell质量复制到具有多个检查的域计算机



我正在尝试将许可证文件复制到所有域加入计算机,而且我只能使用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

相关内容

  • 没有找到相关文章

最新更新