我有一个带有双重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
}
答案 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
}