[CMD/PS] Как сделать, чтобы скрипт на PowerShell отрабатывал в BATCH-файле?

Denis2707

Постоянный участник
Сообщения
102
Реакции
3
Если скрипт не работает на некоторых ПК с Windows 7 и Windows 11, это может быть вызвано различиями в настройках или правах доступа. Пожалуйста, попробуйте следующие рекомендации:

1. Проверьте права доступа: Убедитесь, что у пользователя, запускающего скрипт, есть достаточные права доступа для чтения файлов на рабочем столе и записи на диск C.

2. Проверьте путь к файлу: Убедитесь, что путь к файлу "qwerty.zip" указан корректно и что файл действительно существует на рабочем столе.

3. Запустите скрипт с правами администратора: Попробуйте запустить скрипт с правами администратора, особенно на Windows 7, где могут потребоваться дополнительные разрешения.

4. Используйте PowerShell: Вместо batch-скрипта вы можете попробовать использовать скрипт на PowerShell, который может быть более совместим с разными версиями Windows. Вот пример PowerShell скрипта для копирования файла "qwerty.zip" с рабочего стола на диск C:

PowerShell:
$source = "$env:USERPROFILE\Desktop"
$destination = "C:\"
$fileToFind = "qwerty.zip"

Get-ChildItem -Path $source -Recurse | Where-Object { $_.Name -eq $fileToFind } | ForEach-Object {
    Copy-Item $_.FullName $destination
}

Попробуйте эти рекомендации и сообщите, если у вас возникнут дополнительные вопросы или проблемы.
@AssistGPT Как сделать, чтобы скрипт на PowerShell отрабатывал в BATCH-файле ?
 
@AssistGPT Как сделать, чтобы скрипт на PowerShell отрабатывал в BATCH-файле ?
Для того чтобы запустить скрипт на PowerShell из batch-файла, вам нужно добавить команду вызова PowerShell с вашим скриптом. Вот как это можно сделать:

1. Создайте новый batch-файл (например, script.bat) и откройте его в текстовом редакторе.

2. Добавьте следующую строку в ваш batch-файл, чтобы вызвать PowerShell и выполнить ваш скрипт:

CMD/BATCH:
powershell.exe -ExecutionPolicy Bypass -File "путь_к_вашему_скрипту.ps1"

Замените "путьквашему_скрипту.ps1" на путь к вашему скрипту на PowerShell (например, "C:\путь\к\вашему\скрипту.ps1").

3. Сохраните изменения в batch-файле.

Теперь, когда вы запустите batch-файл, он вызовет PowerShell и выполнит ваш скрипт на PowerShell. Пожалуйста, убедитесь, что в вашем скрипте на PowerShell нет ошибок и он работает корректно.

Попробуйте это решение и сообщите, если у вас возникнут дополнительные вопросы или проблемы.
 
Для того чтобы запустить скрипт на PowerShell из batch-файла, вам нужно добавить команду вызова PowerShell с вашим скриптом. Вот как это можно сделать:

1. Создайте новый batch-файл (например, script.bat) и откройте его в текстовом редакторе.

2. Добавьте следующую строку в ваш batch-файл, чтобы вызвать PowerShell и выполнить ваш скрипт:

CMD/BATCH:
powershell.exe -ExecutionPolicy Bypass -File "путь_к_вашему_скрипту.ps1"

Замените "путьквашему_скрипту.ps1" на путь к вашему скрипту на PowerShell (например, "C:\путь\к\вашему\скрипту.ps1").

3. Сохраните изменения в batch-файле.

Теперь, когда вы запустите batch-файл, он вызовет PowerShell и выполнит ваш скрипт на PowerShell. Пожалуйста, убедитесь, что в вашем скрипте на PowerShell нет ошибок и он работает корректно.

Попробуйте это решение и сообщите, если у вас возникнут дополнительные вопросы или проблемы.
@AssistGPT А чтобы внутри batch-файла отрабатывал скрипт PowerShell ? Только один batch-файл, не нужно создавать отдельный файл скрипт.ps1
 
@AssistGPT А чтобы внутри batch-файла отрабатывал скрипт PowerShell ? Только один batch-файл, не нужно создавать отдельный файл скрипт.ps1
Для того чтобы внутри batch-файла отработал скрипт PowerShell без необходимости создания отдельного файла .ps1, вы можете вставить сам скрипт PowerShell прямо внутрь batch-файла. Вот пример того, как это можно сделать:

CMD/BATCH:
@echo off

set "source=%USERPROFILE%\Desktop"
set "destination=C:\"
set "fileToFind=qwerty.zip"

echo $source = "%source%" > tmp.ps1
echo $destination = "%destination%" >> tmp.ps1
echo $fileToFind = "%fileToFind%" >> tmp.ps1
echo Get-ChildItem -Path $source -Recurse ^| Where-Object { $_.Name -eq $fileToFind } ^| ForEach-Object { >> tmp.ps1
echo     Copy-Item $_.FullName $destination >> tmp.ps1
echo } >> tmp.ps1

powershell.exe -ExecutionPolicy Bypass -File tmp.ps1

del tmp.ps1

В этом примере скрипт PowerShell вставлен внутрь batch-файла. Он создает временный файл tmp.ps1, в который записывает скрипт PowerShell, а затем запускает PowerShell для выполнения этого скрипта. После выполнения скрипта PowerShell временный файл удаляется.

Попробуйте использовать этот подход и проверьте, работает ли он для вашего случая. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.
 
Для того чтобы внутри batch-файла отработал скрипт PowerShell без необходимости создания отдельного файла .ps1, вы можете вставить сам скрипт PowerShell прямо внутрь batch-файла. Вот пример того, как это можно сделать:

CMD/BATCH:
@echo off

set "source=%USERPROFILE%\Desktop"
set "destination=C:\"
set "fileToFind=qwerty.zip"

echo $source = "%source%" > tmp.ps1
echo $destination = "%destination%" >> tmp.ps1
echo $fileToFind = "%fileToFind%" >> tmp.ps1
echo Get-ChildItem -Path $source -Recurse ^| Where-Object { $_.Name -eq $fileToFind } ^| ForEach-Object { >> tmp.ps1
echo     Copy-Item $_.FullName $destination >> tmp.ps1
echo } >> tmp.ps1

powershell.exe -ExecutionPolicy Bypass -File tmp.ps1

del tmp.ps1

В этом примере скрипт PowerShell вставлен внутрь batch-файла. Он создает временный файл tmp.ps1, в который записывает скрипт PowerShell, а затем запускает PowerShell для выполнения этого скрипта. После выполнения скрипта PowerShell временный файл удаляется.

Попробуйте использовать этот подход и проверьте, работает ли он для вашего случая. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.
@AssistGPT Как сделать после того, как внутри batch-файла отработал скрипт PowerShell, продолжение batch-файла в оригинальном виде без изменения вида консоли которое изменяет скрипт PowerShell ?
 
@AssistGPT Как сделать после того, как внутри batch-файла отработал скрипт PowerShell, продолжение batch-файла в оригинальном виде без изменения вида консоли которое изменяет скрипт PowerShell ?
Для того чтобы продолжить выполнение batch-файла после отработки скрипта PowerShell без изменения вида консоли, можно использовать оператор call для запуска скрипта PowerShell. Вот пример того, как это можно сделать:

CMD/BATCH:
@echo off

set "source=%USERPROFILE%\Desktop"
set "destination=C:\"
set "fileToFind=qwerty.zip"

echo $source = "%source%" > tmp.ps1
echo $destination = "%destination%" >> tmp.ps1
echo $fileToFind = "%fileToFind%" >> tmp.ps1
echo Get-ChildItem -Path $source -Recurse ^| Where-Object { $_.Name -eq $fileToFind } ^| ForEach-Object { >> tmp.ps1
echo     Copy-Item $_.FullName $destination >> tmp.ps1
echo } >> tmp.ps1

call powershell.exe -ExecutionPolicy Bypass -File tmp.ps1

del tmp.ps1

REM Продолжение batch-файла
echo Скрипт PowerShell отработал. Продолжаем выполнение batch-файла.

В этом примере после выполнения скрипта PowerShell с помощью call, выполнение batch-файла продолжится без изменения вида консоли. После удаления временного файла tmp.ps1, можно добавить любые дополнительные команды или скрипты для продолжения работы batch-файла.

Попробуйте использовать этот подход и проверьте, работает ли он для вашего случая. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.
 
Для того чтобы продолжить выполнение batch-файла после отработки скрипта PowerShell без изменения вида консоли, можно использовать оператор call для запуска скрипта PowerShell. Вот пример того, как это можно сделать:

CMD/BATCH:
@echo off

set "source=%USERPROFILE%\Desktop"
set "destination=C:\"
set "fileToFind=qwerty.zip"

echo $source = "%source%" > tmp.ps1
echo $destination = "%destination%" >> tmp.ps1
echo $fileToFind = "%fileToFind%" >> tmp.ps1
echo Get-ChildItem -Path $source -Recurse ^| Where-Object { $_.Name -eq $fileToFind } ^| ForEach-Object { >> tmp.ps1
echo     Copy-Item $_.FullName $destination >> tmp.ps1
echo } >> tmp.ps1

call powershell.exe -ExecutionPolicy Bypass -File tmp.ps1

del tmp.ps1

REM Продолжение batch-файла
echo Скрипт PowerShell отработал. Продолжаем выполнение batch-файла.

В этом примере после выполнения скрипта PowerShell с помощью call, выполнение batch-файла продолжится без изменения вида консоли. После удаления временного файла tmp.ps1, можно добавить любые дополнительные команды или скрипты для продолжения работы batch-файла.

Попробуйте использовать этот подход и проверьте, работает ли он для вашего случая. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать.
@AssistGPT Не работает, скрипт PowerShell меняет вид консольного окна batch-файла
 
@AssistGPT Не работает, скрипт PowerShell меняет вид консольного окна batch-файла
Если скрипт PowerShell меняет вид консольного окна batch-файла, это может быть вызвано тем, что PowerShell запускается в новом окне по умолчанию. Для того чтобы избежать этого, можно попробовать запустить PowerShell скрипт в том же окне консоли. Вот как это можно сделать:

CMD/BATCH:
@echo off

set "source=%USERPROFILE%\Desktop"
set "destination=C:\"
set "fileToFind=qwerty.zip"

echo $source = "%source%" > tmp.ps1
echo $destination = "%destination%" >> tmp.ps1
echo $fileToFind = "%fileToFind%" >> tmp.ps1
echo Get-ChildItem -Path $source -Recurse ^| Where-Object { $_.Name -eq $fileToFind } ^| ForEach-Object { >> tmp.ps1
echo     Copy-Item $_.FullName $destination >> tmp.ps1
echo } >> tmp.ps1

powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "& { .\tmp.ps1 }"

del tmp.ps1

REM Продолжение batch-файла
echo Скрипт PowerShell отработал. Продолжаем выполнение batch-файла.

В этом примере используется параметр -NoProfile для запуска PowerShell без загрузки профиля, что может ускорить запуск. Кроме того, команда -Command "& { .\tmp.ps1 }" запускает скрипт PowerShell в том же окне консоли.

Попробуйте использовать этот подход и проверьте, помог ли он избежать изменения вида консоли. Если проблема остается, пожалуйста, уточните, какие именно изменения происходят в консоли после выполнения скрипта PowerShell.
 
Если скрипт PowerShell меняет вид консольного окна batch-файла, это может быть вызвано тем, что PowerShell запускается в новом окне по умолчанию. Для того чтобы избежать этого, можно попробовать запустить PowerShell скрипт в том же окне консоли. Вот как это можно сделать:

CMD/BATCH:
@echo off

set "source=%USERPROFILE%\Desktop"
set "destination=C:\"
set "fileToFind=qwerty.zip"

echo $source = "%source%" > tmp.ps1
echo $destination = "%destination%" >> tmp.ps1
echo $fileToFind = "%fileToFind%" >> tmp.ps1
echo Get-ChildItem -Path $source -Recurse ^| Where-Object { $_.Name -eq $fileToFind } ^| ForEach-Object { >> tmp.ps1
echo     Copy-Item $_.FullName $destination >> tmp.ps1
echo } >> tmp.ps1

powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "& { .\tmp.ps1 }"

del tmp.ps1

REM Продолжение batch-файла
echo Скрипт PowerShell отработал. Продолжаем выполнение batch-файла.

В этом примере используется параметр -NoProfile для запуска PowerShell без загрузки профиля, что может ускорить запуск. Кроме того, команда -Command "& { .\tmp.ps1 }" запускает скрипт PowerShell в том же окне консоли.

Попробуйте использовать этот подход и проверьте, помог ли он избежать изменения вида консоли. Если проблема остается, пожалуйста, уточните, какие именно изменения происходят в консоли после выполнения скрипта PowerShell.
@AssistGPT Не работает, скрипт PowerShell полностью изменяет вид консоли batch-файла, а именно размер окна, размер шрифта, стиль шрифта
 
@AssistGPT Не работает, скрипт PowerShell полностью изменяет вид консоли batch-файла, а именно размер окна, размер шрифта, стиль шрифта
Если скрипт PowerShell изменяет параметры консоли batch-файла, то это может быть вызвано тем, что PowerShell по умолчанию настраивает свои параметры консоли при запуске. Для того чтобы избежать этого, можно сохранить текущие параметры консоли перед запуском PowerShell и восстановить их после выполнения скрипта. Вот пример того, как это можно сделать:

CMD/BATCH:
@echo off

:: Сохраняем текущие параметры консоли
for /f "tokens=1,2 delims= " %%a in ('mode con ^| findstr Columns') do set original_columns=%%b
for /f "tokens=1,2 delims= " %%a in ('mode con ^| findstr Lines') do set original_lines=%%b
for /f "tokens=1,2 delims= " %%a in ('reg query "HKCU\Console" /v FaceName ^| find "REG_SZ"') do set original_font=%%b
for /f "tokens=1,2 delims= " %%a in ('reg query "HKCU\Console" /v FontSize ^| find "REG_DWORD"') do set original_fontsize=%%b

:: Ваш скрипт PowerShell
set "source=%USERPROFILE%\Desktop"
set "destination=C:\"
set "fileToFind=qwerty.zip"

echo $source = "%source%" > tmp.ps1
echo $destination = "%destination%" >> tmp.ps1
echo $fileToFind = "%fileToFind%" >> tmp.ps1
echo Get-ChildItem -Path $source -Recurse ^| Where-Object { $_.Name -eq $fileToFind } ^| ForEach-Object { >> tmp.ps1
echo     Copy-Item $_.FullName $destination >> tmp.ps1
echo } >> tmp.ps1

powershell.exe -ExecutionPolicy Bypass -NoProfile -Command "& { .\tmp.ps1 }"

del tmp.ps1

:: Восстанавливаем параметры консоли
mode con cols=%original_columns% lines=%original_lines%
reg add "HKCU\Console" /v FaceName /t REG_SZ /d %original_font% /f
reg add "HKCU\Console" /v FontSize /t REG_DWORD /d %original_fontsize% /f

REM Продолжение batch-файла
echo Скрипт PowerShell отработал. Продолжаем выполнение batch-файла.

Этот скрипт сохраняет текущие параметры консоли (количество столбцов, количество строк, шрифт и размер шрифта), запускает скрипт PowerShell, а затем восстанавливает исходные параметры консоли. Попробуйте использовать этот подход и проверьте, помог ли он сохранить параметры консоли без изменений после выполнения скрипта PowerShell.
 
Предупреждение
@Denis2707, просьба не объединять все разношерстные вопросы в одну тему.


@AssistGPT А чтобы внутри batch-файла отрабатывал скрипт PowerShell ? Только один batch-файл, не нужно создавать отдельный файл скрипт.ps1

Код:
<# :
  @echo off
    setlocal
      powershell /noprofile /executionpolicy bypass^
      "&{[ScriptBlock]::Create((Get-Content '%~f0') -join [Char]10).Invoke(@(&{$args}%*))}"
    endlocal
  exit /b
#>
# здесь ваш код Powershell

@AssistGPT Как сделать после того, как внутри batch-файла отработал скрипт PowerShell, продолжение batch-файла в оригинальном виде без изменения вида консоли которое изменяет скрипт PowerShell ?
А что именно он изменяет и на какой версии ОС? У меня, например, размер окон разный, но ничего не изменяется.
Попробуйте удалить подразделы ключа реестра:
Код:
HKEY_CURRENT_USER\Console
 
Назад
Сверху Снизу