Как правильно вызвать скрипт Powershell из пакетного скрипта (исправить ошибку) - PullRequest
1 голос
/ 14 февраля 2020

Мой скрипт в пакетном режиме main.bat должен вызывать другой скрипт в Powershell 07-PermissionsChecking.ps1, но вместо этого он открывает свойства мыши, и я понятия не имею, почему он это делает.

Когда я запускаю 07-PermissionsChecking.ps1 непосредственно из Powershell, он работает нормально, как и ожидалось. Этот код пытается открыть папки на общем диске и пытается создать файлы для проверки прав доступа для чтения и записи для пользователя.

Может ли кто-нибудь помочь заставить его работать, звоня с main.bat?

РЕДАКТИРОВАТЬ: После того, как я переименовал функцию, ранее названную «основной» в «myfunction», ошибка изменилась на:

"-myfunction : The term 'myfunction' is not recognizer as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again."

main.bat:

Powershell -command "Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser"
Powershell -noexit "& ""Y:\02 - Installations\Batch files\07-PermissionsChecking.ps1"""

07-PermissionsChecking.ps1:

clear 
$error.Clear()

$AvailableProjectsPath = "\\Abrrec01fscp030\swc$\HIL\Available Projects\AccessCtrl"
$WorkspacePath = "\\Abrrec01fscp030\swc$\HIL\Available Projects\Workspace\AccessCtrl"
$WorkInProgressPath = "\\Abrrec01fscp030\swc$\HIL\Work In Progress\AccessCtrl"

$currentDate = (Get-Date).ToString('MM/dd/yyyy')
$currentTime = (Get-Date).ToString('HH:mm:sstt')

$text = ""

myfunction

function myfunction{
    if (Test-Connection -ComputerName Abrrec01fscp030 -Quiet -Count 1){

        CheckAccessStatus $AvailableProjectsPath
        CheckAccessStatus $WorkspacePath
        CheckAccessStatus $WorkInProgressPath

    }
    else
    {
        Write-Host "Make sure you are connected to FIATAUTO network"
    }
}

function CheckAccessStatus{

    Param ([string]$path)

    if(CheckReadAccessStatus $path)
    {
        if(CheckWriteAccessStatus $path)
        {
            $AccessStatus = "R/W";

        } else
        {
            $AccessStatus = "R";
        }
    } else
    {
        $AccessStatus = "-RW";
    }

    $toPrint = "$env:UserName,$env:ComputerName,$currentDate,$currentTime,$path,$AccessStatus"
    Write-Host $toPrint
    add-content -path "$PSScriptRoot\$env:UserName.txt" -value "$toPrint"
}

function CheckReadAccessStatus {

    Param ([string]$path)

    $readAccessStatus = [bool]1 #0: No read access. 1: read access.

    try {

        $error.Clear()
        ii $path -ErrorAction "Stop"

        $shell = New-Object -ComObject Shell.Application
        Start-Sleep -Seconds 1
        $window = $shell.Windows() | Where-Object { $_.LocationURL -like "$(([uri]$path).AbsoluteUri)*" }
        $window | ForEach-Object { $_.Quit() }

    }

    catch [System.UnauthorizedAccessException]{ #$Error[0].Exception.GetType().FullName

        $readAccessStatus = [bool]0 

    }

    $ErrorActionPreference = "Continue"; #Reset the error action pref to default
    return $readAccessStatus
}

function CheckWriteAccessStatus {

    Param ([string]$path)

    $writeAccessStatus = [bool]1 #0: No write access. 1: write access.

    try {

        $error.Clear()
       $toPrint = "$env:UserName,$env:ComputerName,$currentDate,$currentTime,$path,3"
        add-content -path "$path\$env:UserName.txt" -value "$toPrint"

    }

    catch [System.UnauthorizedAccessException]{ #$Error[0].Exception.GetType().FullName

        $writeAccessStatus = [bool]0 

    }

    $ErrorActionPreference = "Continue"; #Reset the error action pref to default
    return $writeAccessStatus
}

1 Ответ

1 голос
/ 15 февраля 2020

Причина открытия свойств мыши в том, что windows имеет команду main.cpl, которая открывает свойства мыши. Можете ли вы изменить имя своей функции с основного на другое? main после $text="" - это то, что открывает свойства вашей мыши, так как вы запускаете ее из строки cmd

Переместите функции выше вашего фактического кода. Когда вы определяете свои функции после выполнения команд, компилятор не будет ничего знать о функциях. Компилятор должен сначала прочитать функции, а затем он будет знать, как выполнить их при вызове по имени.

TryMe

Function TryMe {
  Write-output "Hello" 
}

Выше произойдет сбой, поскольку TryMe определено после выполнения.

Правильный путь

Function TryMe {
  Write-output "Hello" 
}

TryMe # Writes Hello successfully.

Переместить весь имеющийся у вас код после объявления функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...