1

我是 powershell 的新手,但很想好好利用它。我正在编写一个应该执行以下操作的脚本:

  • 检查特定位置(映射驱动器)中是否存在特定文件夹
  • 如果文件夹存在,则返回列表
  • 如果该文件夹不存在,则创建它。

理想情况下,我想在 check-if exists-remove-item (subdir) 方面对其进行改进;检查-如果不存在-创建

这是为了促进特定软件的归档过程的自动化。我现在拥有的东西有点工作,但我不知道如何让它完全符合我的要求。

这是代码:

$X = @("Server1", "Server2", "Server3")
$ChkFile = "f:\archive\$server\AABackup"
$myFolder = "f:\archive\$server"
$DirExists = Test-Path $ChkFile
Foreach ($server in $x){
  IF ($DirExists -eq $True) {
     Remove-Item $ChkFile -recurse
     import-Module "AppAssurePowerShellModule"
     start-archive -protectedserver $server -startdate "18/03/2013 5:30 PM" -path "f:\archive\$server"
    }
Elseif ($DirExists -ne $True) {
     New-Item -path $myFolder -itemType "directory"
     import-Module "AppAssurePowerShellModule"
     start-archive -protectedserver $server -startdate "18/03/2013 5:30 PM" -path "f:\archive\$server"
    }
}

是的,我知道这很粗糙……虽然这是我的第一次尝试,所以我绝对可以从这里更有经验的脚本编写者那里受益。

提前致谢。

4

2 回答 2

1

您正在设置$ChkFile,$myFolder并且$DirExists 循环之前,这意味着 $server它还没有值,并且 - 因为变量是立即评估的 - 这些变量将包含垃圾。

您需要在foreach循环内移动这三个语句。

你也不需要比较-eq $true;这会更简单:

if ($dirExists) {
    # ...
}
else {
    # ...
}

哦,你只需要导入一次模块——在脚本的顶部做。

另外,就风格而言:PowerShell 关键字通常应为小写:foreach, if, elseif; 调用 cmdlet 时保持一致(您混合使用lower-caseandUpper-Caselower-Case。请注意,这些并没有真正的区别,但是使用一致的样式可以让其他人更容易阅读代码。我将这些规则建立在我在 TechNet、PoshCode 和这里​​看到的,顺便说一下——它们绝对是主观的。

而且,就个人而言,我使用$lowerCase局部变量和$UpperCase参数(因为它使自动生成的帮助文本看起来更好)。

于 2013-03-20T18:16:35.780 回答
0

试一试。

$specificPath = Z:\MYDir\MySubDir

if(!(Test-Path $SpecificPath))
{
    Mkdir $SpecificPath  
}
Else
{
    Get-ChildItem $specificPath
}

说明:这将检查$SpecificPath使用 Test-Path 中包含的路径是否存在,这将返回一个布尔值。由于我(!())在 IF 语句中使用了语法,它会尝试将该语句评估为 false,如果路径不存在,它将运行第一个代码块。 MkDir是 的别名New-ItemProperty,如果您只传递一个路径,Mkdir它将创建一个目录,类似于 windows MkDir 命令。如果包含在 IF 语句中的语句未计算为假,则 ELSE 块将运行,并对变量执行get-childitema $specificpath

于 2013-03-20T18:10:07.933 回答