Задать вопрос
Местоположение
Россия

Наибольший вклад в теги

Все теги (10)

Лучшие ответы пользователя

Все ответы (19)
  • Как добавлять +1 в название файла при копировании в другую папку, если там уже есть файл с таким названием?

    @FluffyBeaver
    function Get-ResultFilePath {
        param (
            # Путь к файлу, который копируется
            [Parameter(Mandatory = $true)]
            [System.String]
            $SourcePath,
            # Путь к папке, в которую необходимо скопировать файл
            [Parameter(Mandatory = $true)]
            [System.String]
            $DestinationFolder
        )
    
        # Вариант 1
        $File = Get-Item -Path $SourcePath
        $DestinationPath = Join-Path -Path $DestinationFolder -ChildPath "$($File.BaseName)$($File.Extension)"
    
        $i = 1
        While (Test-Path -Path $DestinationPath) {
            $DestinationPath = Join-Path -Path $DestFolder -ChildPath ($File.BaseName, $File.Extension -join "($i)")
            $i++
        }
    
        # Вариант 2
        # $FileBaseName = [System.IO.Path]::GetFileNameWithoutExtension($SourcePath)
        # $FileExtension = [System.IO.Path]::GetExtension($SourcePath)
        # $DestinationPath = Join-Path -Path $DestinationFolder -ChildPath "$FileBaseName$FileExtension"
    
        # $i = 1
        # While (Test-Path -Path $DestinationPath) {
        #     $DestinationPath = Join-Path -Path $DestFolder -ChildPath ($FileBaseName, $FileExtension -join "($i)")
        #     $i++
        # }
    
        return $DestinationPath
    }
    
    $DestFolder = 'F:\tmp'
    $Path = 'C:\tmp\FileName.pdf'
    
    Copy-Item -Path $Path -Destination (Get-ResultFilePath -SourcePath $Path -DestinationFolder $DestFolder)
    Ответ написан
    4 комментария
  • Как включить поддержку выполнения скриптов на всех пк домена?

    @FluffyBeaver
    PowerShell Remoting при наличии домена, на мой взгляд, удобнее всего настраивать через групповые политики.
    Тем более, вбив в Google "enable psremoting group policy" сразу можно получить описание процесса настройки.

    Для запуска скриптов, весьма вероятно, придется определиться ещё и с Execution Policy. В этот раз в Google вбивается "powershell executionpolicy group policy".
    Ответ написан
    1 комментарий
  • Как правильно написать powershell-скрипт для поиска папки по всем компьютерам в сети?

    @FluffyBeaver
    Проверить доступность компьютеров можно, например, так:
    Get-ADComputer -Filter 'OperatingSystem -notlike "*Server*"' | ForEach-Object -Process {
        if (Test-NetConnection -ComputerName $PSItem.DnsHostName -InformationLevel Quiet) {
            Write-Host $PSItem.Name 'доступен' -ForegroundColor Green
        }
        else {
            Write-Host $PSItem.Name 'НЕдоступен' -ForegroundColor Yellow
        }
    }


    Перечитал вопрос - там что-то про поиск версии 1С. Видимо, проверяется, стоит 1с нужной версии или нет.
    Если речь об этом, можно просто проверить, стоит ли 1С применю так:
    # Установка
    $InstalledPackage = Get-Package -Name '1*:Предприятие 8*' -RequiredVersion $PlatformVersion -ErrorAction SilentlyContinue
    if ($InstalledPackage) {
        ##TODO Уже установлена
    }
    else {
        ##TODO Вывод в лог 'Запускаем установку версии' $PlatformVersion
        Start-Process -FilePath 'C:\windows\system32\msiexec.exe' -ArgumentList $ArgumentsArray -Wait
        ##TODO Вывод в лог 'Установили версию' $PlatformVersion -ForegroundColor Green
        ##TODO В try/catch завернуть?
    }
    
    
    # Удаляем старые
    $InstalledPackages = Get-Package -Name '1*:Предприятие 8*' -ErrorAction SilentlyContinue
    foreach ($Package in $InstalledPackages) {
        ##TODO Вывод в лог 'Проверяем версию' $Package.Version
        if ($Package.Version -notin $AllSupportedPlatforms) {
            ##TODO Вывод в лог 'Удаляем версию' $Package.Version
            Uninstall-Package -Name $Package.Name -RequiredVersion $Package.Version -Force
        }
    }


    Необходимо переделать под свои нужды, обернуть в ScriptBock и вставить в пример выше:
    Get-ADComputer -Filter 'Фильтр по вкусу' | ForEach-Object -Process {
        if (Test-NetConnection -ComputerName $PSItem.DnsHostName -InformationLevel Quiet) {
            Write-Host $PSItem.Name 'доступен' -ForegroundColor Green
    
            # В $ScriptBlock будет установка/проверка наличия/удаление старых версий/etc 1С
            Invoke-Command -ComputerName $PSItem.DNSHostName -ScriptBlock $ScriptBlock
        }
        else {
            Write-Host $PSItem.Name 'НЕдоступен' -ForegroundColor Yellow
        }
    }


    P.S. - куски кода надерганы из разных скриптов, могут быть ошибки/опечатки.
    Ответ написан
    Комментировать
  • Как с помощью powershell ИНТЕРАКТИВНО запустить mstsc.exe на удаленном сервере?

    @FluffyBeaver
    Если задачу свести к формулировке "запустить что-то на удаленной машине в контексте работающего там пользователя", я бы создал там задачу в Планировщике заданий (от имени того пользователя), которая бы запускала некий скрипт. Затем, при необходимости что-то запустить - правим скрипт и запускаем задачу, а задача уже запускает скрипт в контексте пользователя.
    Может быть есть и более "правильный" способ.
    Но зачем это вообще?
    Ответ написан
    6 комментариев