Windows 跨平台自动化的最佳方法

Windows 跨平台自动化的最佳方法,windows,powershell,automation,Windows,Powershell,Automation,我每天都编辑要在CO2激光器上运行的G代码,在运行之前,我必须从每个文件中删除相同的字符串。目前,我在记事本中打开每个文件,按ctrl+h组合键,并以这种方式替换它。我正在寻找一种更有效的方法 我收到一个带有运行编号(即123456)的数据包,该运行编号对应于网络上的一个目录。该目录中有许多需要删除字符串的.txt或.nc文件 每个运行目录都包含在如下所示的文件结构中 “\\server\x\companyname\123456” 在\companyname\中可能有数百个运行目录,全部为6位数

我每天都编辑要在CO2激光器上运行的G代码,在运行之前,我必须从每个文件中删除相同的字符串。目前,我在记事本中打开每个文件,按ctrl+h组合键,并以这种方式替换它。我正在寻找一种更有效的方法

我收到一个带有运行编号(即123456)的数据包,该运行编号对应于网络上的一个目录。该目录中有许多需要删除字符串的.txt或.nc文件

每个运行目录都包含在如下所示的文件结构中

“\\server\x\companyname\123456”

在\companyname\中可能有数百个运行目录,全部为6位数字-这些是运行编号,每种情况下都不同。我希望能够创建一个程序,提示我输入运行编号,然后在\x中查找该目录,或者更确切地说,在\companyname根据运行编号更改时查找完整路径,然后替换\123456目录中每个文件中的字符串。因此,如果字符串是Y11,并且我得到了运行编号000001,我将被提示输入运行编号,它将搜索目录并将路径设置为\\server\x\walmart\000001\并在该目录中的每个文件中搜索字符串Y11并将其删除

我尝试使用powershell,并能够使用Prompt找到run文件夹,使用-recurse获取childitem,并设置一个提示变量用于-include,但是系统不允许使用脚本

我不能运行脚本,因为它是一台工作计算机。它说脚本的执行在此系统上被禁用。基本上get executionpolicy设置为restricted,我没有这方面的证书

这是我目前掌握的代码

$Run = Read-Host prompt "What is the run number?"
$Files = Get-ChildItem -Path "\\\server\x\" -Filter "$Run" -recurse
foreach ($file in $files)
   (Get-object $file.PSPath) | 
   Foreach-Object {$_ -replace "G33", ""} |
   Set-Content $file.PSPath
以foreach开头的最后一部分是我从前面的示例复制并粘贴的内容。我对powershell几乎没有什么经验。因此,运行编号位于x\下两级的目录中,当提示用户输入运行编号时,我希望它搜索所有x,找到包含运行编号的目录的路径(上面示例中的沃尔玛),然后获取运行编号文件夹中的所有文件。这些文件的路径如下所示

\服务器\x\walmart\000001\118000001\u 01.NC

此运行文件夹中可能有许多文件,它们都需要从中删除字符串G33


我是新手,有人能用powershell、visual basic或任何您认为最简单的方法一步一步地解释一下吗?甚至java!我希望能够在不同操作系统的PC上使用它。大部分是窗户。谢谢

一种可能的解决方案是让该服务器的管理员运行PowerShell的
Set ExecutionPolicy RemoteSigned
commandlet,以便可以执行本地PowerShell脚本。请注意,在Windows 64位上,可能需要从64位PowerShell提示符和32位PowerShell提示符执行此操作,以确保本地PowerShell脚本可以从任意一个PowerShell执行

另一种方法是使用sed(streameditor的缩写),这是一种在Linux、macOS和Windows上可用的经典Unix实用程序。对于后者,在SourceForge上搜索Google上的UnixUtils,其中包括sed和其他几个为Windows构建的经典Unix实用程序。Sed可以在文本文件中进行全局搜索和替换。它是非交互式的,可以从脚本(或批处理文件)执行

VBScript还可以读取每个文本文件并进行搜索和替换。您可以打开文本文件并使用循环读取每一行。如果一行包含搜索字符串,则替换该文本(可选为“无”),然后写入该文本;否则,请不加修改地编写它。以与正在读取的文件相同的路径写入临时文件,完成后删除原始临时文件并将新临时文件重命名为原始文件名。您必须始终进行错误检查

至于按运行编号定位子文件夹,您可能可以使用批处理文件(或Linux和macOS上的bash脚本)来定位。大概是这样的:

@echo off

:get-directory-list
dir \\server\x /S /B /AD /OGNE > "C:\Users\Me\Desktop\ListOfDirectories.txt"

:prompt-runnumber
SET RUNNUMBER=
SET /P RUNNUMBER= Enter the 6-digit run number: 
if not defined RUNNUMBER echo invalid input & goto prompt-runnumber
if /i "%RUNNUMBER%" EQU "q" goto :EOF

:get-dir-for-run-number
type "C:\Users\Me\Desktop\ListOfDirectories.txt" | find "%RUNNUMBER%" > nul
if ERRORLEVEL 1 echo Run Number not found & goto prompt-runnumber
type "C:\Users\Me\Desktop\ListOfDirectories.txt" | find "%RUNNUMBER%" > %TEMP%\%~n0.tmp"
set /P RUNFOLDER= < "%TEMP%\%~n0.tmp"   
echo Run Folder full path is %RUNFOLDER%

:process-files-in-folder
for %%i in (%RUNFOLDER%\*.*) do (
    echo Processing folder %RUNFOLDER%, file %%i
    rem ... run sed, VBscript, etc. to edit file
)
@echo关闭
:获取目录列表
dir\\server\x/S/B/AD/OGNE>“C:\Users\Me\Desktop\ListOfDirectories.txt”
:提示运行编号
设置运行编号=
设置/P运行编号=输入6位运行编号:
如果未定义RUNNUMBER,则返回无效输入并转到提示符RUNNUMBER
如果/i“%RUNNUMBER%”等于“q”转到:EOF
:获取运行编号的目录
键入“C:\Users\Me\Desktop\ListOfDirectories.txt”|查找“%RUNNUMBER%”nul
如果找不到ERRORLEVEL 1回显运行编号&转到提示运行编号
键入“C:\Users\Me\Desktop\ListOfDirectories.txt”|查找“%RUNNUMBER%”>%TEMP%\%~n0.tmp
set/P RUNFOLDER=<%TEMP%\%~n0.tmp
回显运行文件夹完整路径为%RUNFOLDER%
:处理文件夹中的文件
对于(%RUNFOLDER%\*.*)中的%%i,请执行以下操作(
回显处理文件夹%RUNFOLDER%,文件%%i
rem…运行sed、VBscript等来编辑文件
)
您可能必须编辑上面的批处理文件才能使用映射的驱动器号。对于bash,您必须首先装载网络共享并参考装载点“目录”


bash提供了相应的命令来列出目录、对目录进行排序、搜索文本字符串(使用grep而不是find)、提示输入、从文本文件读取输入等。Windows Batch和bash都支持子例程(批处理文件可以调用自身并将标签作为参数传递)如果需要。

一种可能的解决方案是让该服务器的管理员运行PowerShell的
Set ExecutionPolicy RemoteSigned
commandlet,以便可以执行本地PowerShell脚本。请注意,在Windows 64位上,这可能需要从64位PowerShell提示符和32位PowerShell提示符执行,以确保本地PowerShell脚本可以从任意一个PowerShell执行

另一种方法是使用sed(streameditor的缩写),这是一种在Linux、macOS和Windows上可用的经典Unix实用程序