如何使用Powershell使用double if语句?

时间:2019-06-13 05:57:01

标签: powershell

我有一个带有双重if语句的批处理脚本。我想将其转换为powershell。我尝试了这段代码,但仍然无法正常工作。

我的批处理脚本

IF %ERRORLEVEL% equ 1 (
    IF NOT EXIST %FE_WKFD%\AUTO MKDIR %FE_WKFD%\AUTO
    IF NOT EXIST %FE_WKFD%\AUTO\POB MKDIR %FE_WKFD%\AUTO\POB
    IF NOT EXIST %FE_WKFD%\AUTO\file MKDIR %FE_WKFD%\AUTO\file
    IF NOT EXIST %FE_WKFD%\AUTO\Auto.txt ECHO Auto Text >> %FE_WKFD%\AUTO\Auto.txt
    GOTO B_F
)
GOTO Stop_F

我的Powershell脚本

Function GUI_Choose
{
  & "C:\Users\run.cmd"
  Start-Sleep -s 1 
  $Log = Get-Content "C:\Users\log.txt" |
    Where-Object {$_.Contains("1")}
#####This part convert from batch file#####
  if($Log -and 
    (![System.IO.Directory]::Exists("$FE_WKFD\AUTO")) -and
    (![System.IO.Directory]::Exists("$FE_WKFD\AUTO\POB")) -and
    (![System.IO.Directory]::Exists("$FE_WKFD\AUTO\file")) -and
    (![System.IO.Directory]::Exists("$FE_WKFD\AUTO\Auto.txt"))
    {
     New-Item -ItemType Directory -Force -Path "$WKFD_Path\AUTO"
     New-Item -ItemType Directory -Force -Path "$WKFD_Path\AUTO\POB"
     New-Item -ItemType Directory -Force -Path "$WKFD_Path\AUTO\file"
     New-Item -ItemType Directory -Force -Path "$WKFD_Path\AUTO\Auto.txt"
     }
    B_F #Another Function
}
else
{
    Stop_F #Another Function
}
$FE_WKFD = "C:\Users\"
if(Test-Path -Path "$FE_WKFD\Auto. txt"){
    AUTO #Another FUnction
}
else
{
    GUI_Choose
}

1 个答案:

答案 0 :(得分:2)

原始的Powershell代码包含一个错误。像这样-and的链接条件,

(![System.IO.Directory]::Exists("$FE_WKFD\AUTO")) -and
(![System.IO.Directory]::Exists("$FE_WKFD\AUTO\POB")) -and

表示仅当所有目录都丢失时才创建所有目录。在批处理中,将分别测试和创建每个目录。

惯用的Powershell方法是将Dirs存储在集合中,对其进行迭代并创建缺失的内容。在同一结构中测试文件而不是目录的边缘情况并非一成不变,而是具有自己的if语句。

进一步的可读性改进是使用简单条件。代替if something and something and so and so,首先测试是否设置了$Log,然后开始测试目录。像这样

if($Log) {
    # A list of subdirectories 
    $autoDirs = @("AUTO", "AUTO\POB", "AUTO\file")
    # Iterate subdir list using foreach % operator
    $autoDirs | % {
        # See if subdir exists. $_ is picked from $autoDirs
        if(-not test-path $_) {
            # ... and create if doesn't
            new-item -itemtype directory -path $(join-path $WKFD_Path $_)
        }
    }
    # Create file if it doesn't exist
    if(-not test-path "$WKFD_Path\AUTO\Auto.txt") {
        new-item -itemtype file -path "$WKFD_Path\AUTO\Auto.txt" -value "Auto text"
    }
    B_F

} else {
    Stop_F
}